返回
Java NIO 巧用事件轮询,助力高效非阻塞写操作
后端
2023-12-31 19:45:53
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 实现非阻塞写,需要使用以下步骤:
- 打开一个 Channel
- 创建一个 Selector
- 将 Channel 注册到 Selector 上
- 调用 Selector.select() 阻塞等待 I/O 事件发生
- 当 I/O 事件发生时,调用 Selector.selectedKeys() 获取所有已经就绪的 Channel
- 对每个就绪的 Channel 进行相应的操作
服务端实现文件上传
服务端可以使用 Java NIO 来实现文件上传的功能。
具体步骤如下:
- 打开一个 ServerSocketChannel
- 将 ServerSocketChannel 注册到 Selector 上
- 调用 Selector.select() 阻塞等待 I/O 事件发生
- 当 I/O 事件发生时,调用 Selector.selectedKeys() 获取所有已经就绪的 Channel
- 如果就绪的 Channel 是 ServerSocketChannel,则接受客户端连接
- 如果就绪的 Channel 是 SocketChannel,则接收客户端发送的数据
- 将接收到的数据保存到文件中
客户端实现文件上传
客户端可以使用 Java NIO 来实现文件上传的功能。
具体步骤如下:
- 打开一个 SocketChannel
- 将 SocketChannel 连接到服务端
- 从文件中读取数据
- 将数据发送到服务端
- 等待服务端确认文件上传成功
运行结果示例
服务端运行日志:
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