NIO

作者: 全满 | 来源:发表于2019-05-06 11:13 被阅读0次

传统的socket分析

传统IO与NIO的比较
  • 传统IO特点
    • 阻塞点
      server.accept()
      inputStream.read(bytes)
    • 单线程情况下只能有一个客户端
    • 用线程池可以有多个客户端连接,但是非常消耗性能
  • NIO特点
    ServerSocketChannel ServerSocket
    SocketChannel Socket
    Selector SelectionKey
  • NIO的疑问
  1. 客户端关闭的时候会抛出异常,死循环
    解决方案:
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();
}
  1. 读NIO的时候发现selector.select();是阻塞的。那为什么说NIO是非阻塞的IO呢?
    elector.select(1000)可以不阻塞
    elector.wakeup();可以唤醒selector
  2. SelectorKey.OP_WRITE是代表什么意思
    OP_WRITE表示底层缓冲区是否有空间,是则响应返回true
    NIO.png
    socketIO.png

相关文章

网友评论

      本文标题:NIO

      本文链接:https://www.haomeiwen.com/subject/ignloqtx.html