论坛首页 Java企业应用论坛

java NIO Socket 总结

浏览 10475 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-05-20  
对于服务器 socketChannel (ServerSocketChannel),唯一(也只能)关心的操作是 OP_ACCEPT(表示一个新的客户端连接)。
一般一个线程应可以共享一个 Buffer 。
在没有客户端请求时,Selector.select() 将一直堵塞。应该将此做为唯一的堵塞时刻(在 I/0 Socket 中,在读数据时也会堵塞),做为服务器一般会无限循环此条件。
在自 Selector.selectedKeys().iterator() 中得到的 SelectionKey 时,就应该调用 iterator 的remove() 方法将其自集合中删除,防止忘记删除或删除地点不统一。
客户端的读或写等操作应在 ServerSocketChannel 的 OP_ACCEPT 事件中进行初始注册(注册后会在下一次 Selector.select() 循环时调用)。即注册与客户端建立连接后要做的事情。然后在其他相应的操作中注册其他事件(一次会话在不同事件中相互调用)。
在 OP_ACCEPT 事件中应将客户端通道设置为非阻塞模式以允许服务器处理多个并发连接。
在读或写操作时应将对 Buffer 的操作放在循环中,以免一次不能处理完毕 Buffer 中的全部数据。
一次循环有时只能处理读或写的一部分操作(视 Buffer 大小与传递数据多少等而定),剩余数据将在下一次 Selector.select() 循环时处理,这与 I/O Socket 中等待数据全部到达时再处理从根本上不相同,要转变思想。
若希望关闭与客户端的会话只需将客户端通道关闭即可。
深入研究了 NIO Socket ,才深深体会到 Apache MINA 设计的美妙!

论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics