java nio 是一种处理高并发请求的高效技术,使用非阻塞 i/o 和轮询机制实现:创建 nio selector 监听事件;注册 channel 到 selector,监听 accept 事件;循环等待事件,处理 accept、read、write 事件;accept 事件处理客户端连接,创建 socketchannel;read 事件读取数据,write 事件回写数据。
Java 函数使用 NIO 处理高并发请求
简介
非阻塞 I/O (NIO) 是 Java 中一种用于处理大量并发请求的高效技术。它通过异步操作和轮询机制,有效地利用系统资源,提升系统吞吐量。
步骤
1. 创建 NIO Selector
NIO Selector 用于监听注册的 Channel 上的事件。
Selector selector = Selector.open();
登录后复制
2. 注册 Channel
将 ServerSocketChannel 注册到 Selector,监听 ACCEPT 事件。
ServerSocketChannel serverChannel = ServerSocketChannel.open(); serverChannel.configureBlocking(false); serverChannel.register(selector, SelectionKey.OP_ACCEPT);
登录后复制
3. 循环等待事件
通过 Selector.select() 方法监听事件。
while (true) { selector.select(); Set<SelectionKey> keys = selector.selectedKeys(); // 处理事件... }
登录后复制
4. 处理 ACCEPT 事件
当 ACCEPT 事件发生时,接受连接并创建 SocketChannel。
if (key.isAcceptable()) { ServerSocketChannel channel = (ServerSocketChannel) key.channel(); SocketChannel clientChannel = channel.accept(); clientChannel.configureBlocking(false); clientChannel.register(selector, SelectionKey.OP_READ); }
登录后复制
实战案例
以下是一个简单的 Java NIO Echo 服务器示例。它监听客户端连接,并回显收到的消息。
EchoServer.java
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; public class EchoServer { private Selector selector; private ServerSocketChannel serverChannel; private int port; public EchoServer(int port) { this.port = port; } public void start() throws IOException { // 创建 Selector selector = Selector.open(); // 创建 ServerSocketChannel serverChannel = ServerSocketChannel.open(); serverChannel.configureBlocking(false); serverChannel.bind(new InetSocketAddress(port)); serverChannel.register(selector, SelectionKey.OP_ACCEPT); // 不断循环等待事件 while (true) { int keysCount = selector.select(); if (keysCount == 0) { continue; } Set<SelectionKey> keys = selector.selectedKeys(); for (SelectionKey key : keys) { try { if (key.isAcceptable()) { handleAccept(key); } else if (key.isReadable()) { handleRead(key); } else if (key.isWritable()) { handleWrite(key); } } catch (IOException e) { e.printStackTrace(); key.cancel(); SocketChannel channel = (SocketChannel) key.channel(); channel.close(); } } keys.clear(); } } private void handleAccept(SelectionKey key) throws IOException { ServerSocketChannel channel = (ServerSocketChannel) key.channel(); SocketChannel clientChannel = channel.accept(); clientChannel.configureBlocking(false); clientChannel.register(selector, SelectionKey.OP_READ); } private void handleRead(SelectionKey key) throws IOException { SocketChannel channel = (SocketChannel) key.channel(); ByteBuffer buffer = ByteBuffer.allocate(1024); int readBytes = channel.read(buffer); if (readBytes == -1) { channel.close(); return; } buffer.flip(); channel.write(buffer); } private void handleWrite(SelectionKey key) throws IOException { SocketChannel channel = (SocketChannel) key.channel(); channel.write(ByteBuffer.allocate(1024)); } public static void main(String[] args) throws IOException { new EchoServer(9090).start(); } }
登录后复制
以上就是Java 函数如何使用 NIO 技术处理高并发请求?的详细内容,更多请关注叮当号网其它相关文章!
文章来自互联网,只做分享使用。发布者:weapp,转转请注明出处:https://www.dingdanghao.com/article/426917.html