返回

Java NIO 巧用事件轮询,助力高效非阻塞写操作

后端

Java NIO 介绍

Java NIO(New Input/Output)是一套新的 IO API,它提供了与传统 IO API 不同的编程模型,NIO 更加注重非阻塞 I/O。
NIO 的主要优点是它可以使用更少的线程来处理更多的并发连接,这对于高并发应用非常重要。

事件轮询

事件轮询是一种 I/O 多路复用技术,它可以让一个线程同时监听多个 I/O 事件。
当某个 I/O 事件发生时,该线程会收到通知,然后对该事件进行处理。

Java NIO 实现非阻塞写

使用 Java NIO 实现非阻塞写,需要使用以下步骤:

  1. 打开一个 Channel
  2. 创建一个 Selector
  3. 将 Channel 注册到 Selector 上
  4. 调用 Selector.select() 阻塞等待 I/O 事件发生
  5. 当 I/O 事件发生时,调用 Selector.selectedKeys() 获取所有已经就绪的 Channel
  6. 对每个就绪的 Channel 进行相应的操作

服务端实现文件上传

服务端可以使用 Java NIO 来实现文件上传的功能。
具体步骤如下:

  1. 打开一个 ServerSocketChannel
  2. 将 ServerSocketChannel 注册到 Selector 上
  3. 调用 Selector.select() 阻塞等待 I/O 事件发生
  4. 当 I/O 事件发生时,调用 Selector.selectedKeys() 获取所有已经就绪的 Channel
  5. 如果就绪的 Channel 是 ServerSocketChannel,则接受客户端连接
  6. 如果就绪的 Channel 是 SocketChannel,则接收客户端发送的数据
  7. 将接收到的数据保存到文件中

客户端实现文件上传

客户端可以使用 Java NIO 来实现文件上传的功能。
具体步骤如下:

  1. 打开一个 SocketChannel
  2. 将 SocketChannel 连接到服务端
  3. 从文件中读取数据
  4. 将数据发送到服务端
  5. 等待服务端确认文件上传成功

运行结果示例

服务端运行日志:

2022-08-16 10:10:10 INFO  Server started on port 8080
2022-08-16 10:10:11 INFO  Client connected from /127.0.0.1:54321
2022-08-16 10:10:12 INFO  Receiving data from client
2022-08-16 10:10:13 INFO  Data received from client, size: 1024 bytes
2022-08-16 10:10:14 INFO  Saving data to file
2022-08-16 10:10:15 INFO  File saved successfully
2022-08-16 10:10:16 INFO  Sending confirmation to client
2022-08-16 10:10:17 INFO  Client disconnected

客户端运行日志:

2022-08-16 10:10:10 INFO  Client started
2022-08-16 10:10:11 INFO  Connecting to server on port 8080
2022-08-16 10:10:12 INFO  Connected to server
2022-08-16 10:10:13 INFO  Sending data to server
2022-08-16 10:10:14 INFO  Data sent to server, size: 1024 bytes
2022-08-16 10:10:15 INFO  Waiting for confirmation from server
2022-08-16 10:10:16 INFO  Confirmation received from server
2022-08-16 10:10:17 INFO  File uploaded successfully
2022-08-16 10:10:18 INFO  Client stopped