3月16日java学习笔记
Selector与网络编程实战
- NIO服务端实现步骤
// 1. 创建Selector
Selector selector = Selector.open();
// 2. 创建ServerSocketChannel并绑定端口
ServerSocketChannel ssc = ServerSocketChannel.open();
ssc.bind(new InetSocketAddress(8080));
ssc.configureBlocking(false); // 非阻塞模式
// 3. 注册Accept事件到Selector
ssc.register(selector, SelectionKey.OP_ACCEPT);
while (true) {
selector.select(); // 阻塞等待就绪事件
Set
Iterator
while (iter.hasNext()) {
SelectionKey key = iter.next();
iter.remove();
if (key.isAcceptable()) { // 处理新连接
SocketChannel sc = ssc.accept();
sc.configureBlocking(false);
sc.register(selector, SelectionKey.OP_READ);
} else if (key.isReadable()) { // 处理读事件
SocketChannel sc = (SocketChannel) key.channel();
ByteBuffer buffer = ByteBuffer.allocate(1024);
int len = sc.read(buffer);
if (len > 0) {
buffer.flip();
System.out.println("收到数据:" + StandardCharsets.UTF_8.decode(buffer));
}
}
}
}
2. 粘包/拆包问题解决
定长协议:固定每个数据包长度(如每个包100字节)
分隔符协议:按特定字符(如\n)分割数据
TLV协议:定义Type-Length-Value结构(如 [类型][长度][数据])
浙公网安备 33010602011771号