论坛首页 Java企业应用论坛

解读NIO Socket非阻塞模式

浏览 52243 次
精华帖 (0) :: 良好帖 (5) :: 新手帖 (15) :: 隐藏帖 (1)
作者 正文
   发表时间:2009-02-24  
据我所知,nio一般是用在高并发的服务器上,能说说服务器的线程是怎么处理的吗?
0 请登录后投票
   发表时间:2009-02-24  
刚开始的时候我也很头晕的,过了一个星期才总算接受了这种模式.
0 请登录后投票
   发表时间:2009-02-24  
刚开始的时候我也很头晕的,过了一个星期才总算接受了这种模式.
0 请登录后投票
   发表时间:2009-03-01  
cheaper 写道
一个channel有99.9%的几率都是可写的, 如果selecter一个可写状态会导致cpu使用率很高, 相当的恐怖.

谁叫你注册你不该关系的事件了 
0 请登录后投票
   发表时间:2009-03-06  
sdh5724 写道
dennis_zane 写道
cheaper 写道
一个channel有99.9%的几率都是可写的

这种无厘头的结论不知道你是怎么得出来的



他是没有写的数据, 也是selector,因此有了此结论, 根本没有理解注册事件的含义。 我开始不懂的时候也碰到过, 你把可写的事件注册了, 那么selector会一直告诉你可写。 然后就是无限循环了。因此, 数据写完了, 你要把写事件从selector里删除了。 不然有的是苦头。


貌似LZ数据写完以后,就是没有将OP_WRITE注销掉。不知是否我看错了?
#     // 处理事件  
#     protected void process(SelectionKey key) throws IOException {  
#         if (key.isAcceptable()) { // 接收请求  
#             ServerSocketChannel server = (ServerSocketChannel) key.channel();  
#             SocketChannel channel = server.accept();  
#             //设置非阻塞模式  
#             channel.configureBlocking(false);  
#             channel.register(selector, SelectionKey.OP_READ);  
#         } else if (key.isReadable()) { // 读信息  
#             SocketChannel channel = (SocketChannel) key.channel();  
#             int count = channel.read(clientBuffer);  
#             if (count > 0) {  
#                 clientBuffer.flip();  
#                 CharBuffer charBuffer = decoder.decode(clientBuffer);  
#                 name = charBuffer.toString();  
#                 // System.out.println(name);  
#                 SelectionKey sKey = channel.register(selector,  
#                         SelectionKey.OP_WRITE);  
#                 sKey.attach(name);  
#             } else {  
#                 channel.close();  
#             }  
#   
#             clientBuffer.clear();  
#         } else if (key.isWritable()) { // 写事件  
#             SocketChannel channel = (SocketChannel) key.channel();  
#             String name = (String) key.attachment();  
#               
#             ByteBuffer block = encoder.encode(CharBuffer  
#                     .wrap("Hello !" + name));  
#               
#   
#             channel.write(block);  
#   
#             //channel.close();  
#   
#         }  
#     }  

0 请登录后投票
   发表时间:2009-03-06  
我以前写的非阻塞IO是传递一个回调函数进去,单起一个线程监听IO,主线程作其他的事情去....这样可以么?
0 请登录后投票
   发表时间:2009-03-09   最后修改:2009-03-13
我发现这种nio在长连接的情况下的设计真的很复杂, 要处理几种情况

1. 某一用户发了一条信息, 需要服务器反回一个信息(这种最简单)
2. 某一用户发了一条信息,需要服务器广播给所有客户端
3. 某一用户发了一条信息, 需要服务器发给指定的几个客户端
4. 用户没有发信息,服务器跟据某些需要主动发给所有客户端信息
5. 用户没有发信息,服务器跟据某些需要主动发给指定的几个客户端信息
6. 用户发了一条信息,服务器只需计算不需反回。

0 请登录后投票
   发表时间:2009-03-16  
其实之前我一直用普通IO左异步通讯,是通过客户端向服务器发送一个请求,客户端需要返回值,但是又不是立刻就需要,往往是做:客户端传递一个回调函数给发送程序,发送程序用这个回调函数单起一个线程监听,然后客户端客户做别的事情去了,但是效果不是很理想,因为这种请求一多,创建很多线程,理论上客户端可以去做其他事情,但是实际上客户会发现,点击其他功能响应极其缓慢和不可用没区别....nio是不是本质上并非引入了非阻塞的io方法,而是让开发人员在一个线程里实现非阻塞,这样就真地做到了客户端去做其他事情而没影响了,因为始终是一个线程.
0 请登录后投票
   发表时间:2009-06-10  
我跑着有问题啊
0 请登录后投票
   发表时间:2009-06-10  
你那个服务器端一直在给客户端写啊
0 请登录后投票
论坛首页 Java企业应用版

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