IO的阻塞与非阻塞、同步与异步以及Java网络IO交互方式(7)
- UID
- 1029342
- 性别
- 男
|
IO的阻塞与非阻塞、同步与异步以及Java网络IO交互方式(7)
下面是简单的实现:[url=][/url]
public class NioNonBlockingSelectorTest{ Selector selector; private ByteBuffer receivebuffer = ByteBuffer.allocate(1024); @Test public void testNioNonBlockingSelector() throws Exception { selector = Selector.open(); SocketAddress address = new InetSocketAddress(10002); ServerSocketChannel channel = ServerSocketChannel.open(); channel.socket().bind(address); channel.configureBlocking(false); channel.register(selector, SelectionKey.OP_ACCEPT); while(true) { selector.select(); Iterator<SelectionKey> iterator = selector.selectedKeys().iterator(); while (iterator.hasNext()) { SelectionKey selectionKey = iterator.next(); iterator.remove(); handleKey(selectionKey); } } } private void handleKey(SelectionKey selectionKey) throws IOException { ServerSocketChannel server = null; SocketChannel client = null; if(selectionKey.isAcceptable()) { server = (ServerSocketChannel)selectionKey.channel(); client = server.accept(); System.out.println("客户端: " + client.socket().getRemoteSocketAddress().toString()); client.configureBlocking(false); client.register(selector, SelectionKey.OP_READ); } if(selectionKey.isReadable()) { client = (SocketChannel)selectionKey.channel(); receivebuffer.clear(); int count = client.read(receivebuffer); if (count > 0) { String receiveText = new String( receivebuffer.array(),0,count); System.out.println("服务器端接受客户端数据--:" + receiveText); client.register(selector, SelectionKey.OP_READ); } } } }[url=][/url]
Java NIO提供的非阻塞IO并不是单纯的非阻塞IO模式,而是建立在Reactor模式上的IO复用模型;在IO multiplexing Model中,对于每一个socket,一般都设置成为non-blocking,但是整个用户进程其实是一直被阻塞的。只不过进程是被select这个函数阻塞,而不是被socket IO给阻塞,所以还是属于非阻塞的IO。
这篇文章中把这种模式归为了异步阻塞,我其实是认为这是同步非阻塞的,可能看的角度不一样。
异步IO
Java1.7中提供了异步IO的支持,暂时还没有看过,所以以后再讨论。
网络IO优化
对于网络IO有一些基本的处理规则如下:
1。减少交互的次数。比如增加缓存,合并请求。
2。减少传输数据大小。比如压缩后传输、约定合理的数据协议。
3。减少编码。比如提前将字符转化为字节再传输。
4。根据应用场景选择合适的交互方式,同步阻塞,同步非阻塞,异步阻塞,异步非阻塞。
就说到这里吧,感觉有点乱,有些地方还是找不到更贴切的语言来描述。 |
|
|
|
|
|