传统BIO网络编程知识点

1. 同步阻塞模型:传统的BIO网络编程采用同步阻塞模型,当一个线程接收到一个连接请求时,会一直等待直到获取到请求的数据或者超时,期间无法处理其他请求。

2. 每个请求分配一个线程:在BIO模型中,每个请求都需要分配一个线程处理,这样会导致线程数量的增多,而且线程之间切换的成本也会增加。

3. 阻塞IO:BIO模型中的Socket对象的读写操作都是阻塞的,也就是说当读写操作没有数据可读或者没有可以写的空间时,会一直阻塞在那里。

Java NIO

1. 非阻塞模型:Java NIO采用非阻塞模型,使用Selector来监听多个Channel的事件,当一个Channel有读写事件时,会通过Selector进行处理,而不是通过一个线程处理一个请求,大大减少了线程的数量。

2. 单线程处理多个请求:Java NIO模型中,一个线程可以处理多个请求的读写事件,通过Selector监听多个Channel的请求,只有当有请求可处理时才进行读写操作,提高了系统的并发处理能力。

3. 异步IO:Java NIO中的IO操作是非阻塞的,当没有数据可读或没有可以写的空间时,不会阻塞在那里,而是将该事件交给Selector进行处理,可以继续处理其他请求。

Java NIO示例代码

import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

public class NioServer {
    public static void main(String[] args) throws Exception {
        SocketChannel socketChannel = SocketChannel.open();
        socketChannel.configureBlocking(false);
        // 设置非阻塞
        socketChannel.connect(new InetSocketAddress("localhost", 8080));
        // 连接服务器

        while (!socketChannel.finishConnect()) {
            // 等待连接完成
            Thread.sleep(100);
        }
        
        String message = "Hello, Server";
        ByteBuffer byteBuffer = ByteBuffer.wrap(message.getBytes());
        
        while (byteBuffer.hasRemaining()) {
            socketChannel.write(byteBuffer);
            // 写入数据
        }
    }
}

以上代码是一个使用Java NIO实现的简单客户端连接服务器并发送消息的例子。通过配置SocketChannel为非阻塞模式,使得连接和写入操作非阻塞,等待连接完成后,将消息通过ByteBuffer写入到SocketChannel中。