Java NIO(New I/O,非阻塞 I/O)主要通过 Channel、Buffer、Selector 三大核心组件来实现高效通信,尤其适合高并发网络场景。
下面从 核心概念 → 通信模型 → 示例代码 → 关键点 逐步说明。
SocketChannel:TCP 客户端ServerSocketChannel:TCP 服务端DatagramChannel:UDPByteBufferOP_ACCEPTOP_CONNECTOP_READOP_WRITEClient SocketChannel
|
ServerSocketChannel + Selector
|
多个 SocketChannel
优势:
public class NioServer {
public static void main(String[] args) throws Exception {
Selector selector = Selector.open();
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.bind(new InetSocketAddress(8080));
serverChannel.configureBlocking(false);
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select();
Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
while (keys.hasNext()) {
SelectionKey key = keys.next();
keys.remove();
if (key.isAcceptable()) {
SocketChannel client = serverChannel.accept();
client.configureBlocking(false);
client.register(selector, SelectionKey.OP_READ);
}
if (key.isReadable()) {
SocketChannel client = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int len = client.read(buffer);
if (len > 0) {
buffer.flip();
System.out.println("收到:" + new String(buffer.array(), 0, len));
client.write(ByteBuffer.wrap("hello client".getBytes()));
}
}
}
}
}
}
public class NioClient {
public public static void main(String[] args) throws Exception {
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false);
channel.connect(new InetSocketAddress("localhost", 8080));
Selector selector = Selector.open();
channel.register(selector, SelectionKey.OP_CONNECT);
while (true) {
selector.select();
for (SelectionKey key : selector.selectedKeys()) {
if (key.isConnectable()) {
if (channel.finishConnect()) {
channel.register(selector, SelectionKey.OP_WRITE);
}
}
if (key.isWritable()) {
channel.write(ByteBuffer.wrap("hello server".getBytes()));
channel.register(selector, SelectionKey.OP_READ);
}
if (key.isReadable()) {
ByteBuffer buffer = ByteBuffer.allocate(1024);
int len = channel.read(buffer);
if (len > 0) {
System.out.println("收到:" + new String(buffer.array(), 0, len));
}
}
}
}
}
}
channel.configureBlocking(false);
write -> flip -> read -> clear
| 对比项 | BIO | NIO |
|---|---|---|
| 阻塞 | 是 | 否 |
| 线程模型 | 一连接一线程 | 单线程多连接 |
| 并发能力 | 低 | 高 |
| 编程复杂度 | 低 | 高 |
如果你愿意,我可以:
你更想了解哪一部分?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。