Java 语言 NIO非阻塞Socket通信的示例

Java阿木 发布于 2025-06-25 6 次阅读


Java NIO非阻塞Socket通信示例解析

Java NIO(Non-blocking I/O)是Java在JDK 1.4中引入的一种新的I/O模型,它提供了与传统的基于流的I/O不同的异步非阻塞I/O操作。NIO模型通过使用选择器(Selector)和通道(Channel)来提高I/O操作的效率,特别是在处理大量并发连接时。本文将围绕Java NIO非阻塞Socket通信的示例进行解析,帮助读者理解NIO的核心概念和实现方式。

NIO核心概念

在NIO中,核心概念包括:

- 通道(Channel):用于读写数据的通道,如SocketChannel、ServerSocketChannel等。

- 缓冲区(Buffer):用于存储数据的内存区域,如ByteBuffer、CharBuffer等。

- 选择器(Selector):用于监听多个通道的事件(如连接请求、数据可读、数据可写等)。

示例:NIO非阻塞Socket通信

以下是一个简单的NIO非阻塞Socket通信示例,包括客户端和服务端。

服务端代码

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;


import java.util.Iterator;


import java.util.Set;

public class NioServer {


public static void main(String[] args) throws IOException {


// 创建Selector


Selector selector = Selector.open();


// 创建ServerSocketChannel并注册到Selector


ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();


serverSocketChannel.configureBlocking(false);


serverSocketChannel.socket().bind(new InetSocketAddress(8080));


serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);

// 循环等待新连接


while (true) {


// 阻塞等待至少一个通道在你注册的事件上就绪了


selector.select();


// 获取就绪事件的集合


Set<SelectionKey> keys = selector.selectedKeys();


Iterator<SelectionKey> keyIterator = keys.iterator();


while (keyIterator.hasNext()) {


SelectionKey key = keyIterator.next();


// 移除已处理的SelectionKey


keyIterator.remove();


if (key.isAcceptable()) {


// 处理新接受的连接


ServerSocketChannel server = (ServerSocketChannel) key.channel();


SocketChannel client = server.accept();


client.configureBlocking(false);


client.register(selector, SelectionKey.OP_READ);


} else if (key.isReadable()) {


// 处理读事件


SocketChannel client = (SocketChannel) key.channel();


ByteBuffer buffer = ByteBuffer.allocate(1024);


int read = client.read(buffer);


if (read > 0) {


buffer.flip();


String message = new String(buffer.array(), 0, read);


System.out.println("Received: " + message);


buffer.clear();


}


}


}


}


}


}


客户端代码

java

import java.io.IOException;


import java.net.InetSocketAddress;


import java.nio.ByteBuffer;


import java.nio.channels.SocketChannel;

public class NioClient {


public static void main(String[] args) throws IOException {


// 创建SocketChannel


SocketChannel socketChannel = SocketChannel.open();


socketChannel.configureBlocking(false);


// 连接到服务端


socketChannel.connect(new InetSocketAddress("localhost", 8080));


// 等待连接完成


while (!socketChannel.finishConnect()) {


// 可以在这里做其他事情,比如等待


}


// 发送数据


ByteBuffer buffer = ByteBuffer.wrap("Hello, NIO!".getBytes());


socketChannel.write(buffer);


// 关闭连接


socketChannel.close();


}


}


总结

本文通过一个简单的NIO非阻塞Socket通信示例,展示了NIO的核心概念和实现方式。通过使用选择器、通道和缓冲区,我们可以实现高效的异步非阻塞I/O操作。在实际应用中,NIO模型特别适用于需要处理大量并发连接的场景,如服务器端编程。

扩展阅读

- Java NIO官方文档:https://docs.oracle.com/javase/8/docs/api/java/nio/package-summary.html

- Java NIO教程:https://www.tutorialspoint.com/java_nio/index.htm

通过学习和实践Java NIO,你可以提高应用程序的I/O性能,并更好地处理并发连接。