3月16日java学习笔记

Selector与网络编程实战

  1. 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 keys = selector.selectedKeys();
Iterator iter = keys.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结构(如 [类型][长度][数据])

posted @ 2025-03-17 23:28  头发少的文不识  阅读(13)  评论(0)    收藏  举报