NIO
作者:
全满 | 来源:发表于
2019-05-06 11:13 被阅读0次传统的socket分析
传统IO与NIO的比较
- 传统IO特点
- 阻塞点
server.accept()
inputStream.read(bytes)
- 单线程情况下只能有一个客户端
- 用线程池可以有多个客户端连接,但是非常消耗性能
- NIO特点
ServerSocketChannel
ServerSocket
SocketChannel
Socket
Selector
SelectionKey
- NIO的疑问
- 客户端关闭的时候会抛出异常,死循环
解决方案:
int read = channel.read(buffer);
if(read > 0){
byte[] data = buffer.array();
String msg = new String(data).trim();
System.out.println("服务器接收到消息:" + msg);
//回写数据
ByteBuffer outBuffer = ByteBuffer.wrap("好的".getBytes());
//将消息回送给客户端
channel.write(outBuffer);
}else{
System.out.println("客户端关闭");
//结束
key.cancel();
}
- 读NIO的时候发现selector.select();是阻塞的。那为什么说NIO是非阻塞的IO呢?
elector.select(1000)可以不阻塞
elector.wakeup();可以唤醒selector
- SelectorKey.OP_WRITE是代表什么意思
OP_WRITE
表示底层缓冲区是否有空间,是则响应返回true
NIO.png
socketIO.png
本文标题:NIO
本文链接:https://www.haomeiwen.com/subject/ignloqtx.html
网友评论