锁定老帖子 主题:解读NIO Socket非阻塞模式
精华帖 (0) :: 良好帖 (5) :: 新手帖 (15) :: 隐藏帖 (1)
|
|
---|---|
作者 | 正文 |
发表时间:2009-02-24
据我所知,nio一般是用在高并发的服务器上,能说说服务器的线程是怎么处理的吗?
|
|
返回顶楼 | |
发表时间:2009-02-24
刚开始的时候我也很头晕的,过了一个星期才总算接受了这种模式.
|
|
返回顶楼 | |
发表时间:2009-02-24
刚开始的时候我也很头晕的,过了一个星期才总算接受了这种模式.
|
|
返回顶楼 | |
发表时间:2009-03-01
cheaper 写道 一个channel有99.9%的几率都是可写的, 如果selecter一个可写状态会导致cpu使用率很高, 相当的恐怖.
谁叫你注册你不该关系的事件了 |
|
返回顶楼 | |
发表时间: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(); # # } # } |
|
返回顶楼 | |
发表时间:2009-03-06
我以前写的非阻塞IO是传递一个回调函数进去,单起一个线程监听IO,主线程作其他的事情去....这样可以么?
|
|
返回顶楼 | |
发表时间:2009-03-09
最后修改:2009-03-13
我发现这种nio在长连接的情况下的设计真的很复杂, 要处理几种情况
1. 某一用户发了一条信息, 需要服务器反回一个信息(这种最简单) 2. 某一用户发了一条信息,需要服务器广播给所有客户端 3. 某一用户发了一条信息, 需要服务器发给指定的几个客户端 4. 用户没有发信息,服务器跟据某些需要主动发给所有客户端信息 5. 用户没有发信息,服务器跟据某些需要主动发给指定的几个客户端信息 6. 用户发了一条信息,服务器只需计算不需反回。 |
|
返回顶楼 | |
发表时间:2009-03-16
其实之前我一直用普通IO左异步通讯,是通过客户端向服务器发送一个请求,客户端需要返回值,但是又不是立刻就需要,往往是做:客户端传递一个回调函数给发送程序,发送程序用这个回调函数单起一个线程监听,然后客户端客户做别的事情去了,但是效果不是很理想,因为这种请求一多,创建很多线程,理论上客户端可以去做其他事情,但是实际上客户会发现,点击其他功能响应极其缓慢和不可用没区别....nio是不是本质上并非引入了非阻塞的io方法,而是让开发人员在一个线程里实现非阻塞,这样就真地做到了客户端去做其他事情而没影响了,因为始终是一个线程.
|
|
返回顶楼 | |
发表时间:2009-06-10
我跑着有问题啊
|
|
返回顶楼 | |
发表时间:2009-06-10
你那个服务器端一直在给客户端写啊
|
|
返回顶楼 | |