java BIO和NIO的使用方式
本文记录 java BIO 和 NIO 的使用方式,以方便查阅。
BIO
使用的是 ServerSocket 和 Socket
1 | // 创建一个ServerSocket |
当接受到连接请求创建 Socket 对象,每个 Socket 交给一个线程处理,为提高资源利用率,可使用线程池处理 Socket 事件
1 | BufferedReader in = null; |
NIO
使用的是 ServerSocketChannel 和 Selector,其中 Selector 用于实现多路复用,可以将多个 channel 注册到上去
1 | private Selector selector; |
必须将 ServerSocketChannel 配置为非阻塞,否则会报如下错误
1 | Exception in thread "main" java.nio.channels.IllegalBlockingModeException |
从 selector 上获取事件
1 | // 指定超时时间的select操作 |
拿到事件 key 后,需要判断事件的类型,然后进行相应的处理。
如果是 accept 事件,则创建 SocketChannel 并注册到 selector 上,等待 read 事件
1 | if (key.isAcceptable()) { |
如果是 read 事件,则通过 ByteBuffer 读取数据
1 | if (key.isReadable()) { |
若要输出数据,可调用 SocketChannel 的 write 方法写入所需数据
1 | ByteBuffer writeBuffer = ByteBuffer.allocate(bytes.length); |
- 2021-09-08
通过 netstat 命令查看网络状态,其中有一列展示的是 socket 的状态,熟练掌握这些状态的含义有助于连接状态的分析与问题排查。
- 2021-04-14
Netty server 在启动过程中会触发一系列的 Inbound 事件,它的流程是怎样的呢?
- 2021-08-12
在使用 netty 开发网络应用时,通常会设置
ChannelOption.SO_BACKLOG
,不知你有没想过这个参数的作用是什么。 - 2021-01-26
ServerBootstrap 启动时需要初始化 ServerSocketChannel 并将其绑定到 EventLoop 上,用于处理该 channel 上产生的各种事件。那么 ServerSocketChannel 是如何完成创建和初始化的?又是如何绑定到 EventLoop 上的?
- 2021-04-14
在高性能网络通信框架中,I/O 模型和线程模型是两个核心的关注点。对于 I/O 多路复用模型,需要将 selector 上的事件分发给对应的事件处理者。在 Reactor 线程模型中,Reactor 作为事件分发器,负责分发各种 I/O 事件。