1 涉及到的对象
1.1 Selector
Selector用于对其所在的线程这个物理通道进行管理,换句话说,用它来管理所有需要在这个物理通道上进行通信的Channels。
创建一个Selector对象:
Selector selector = Selector.open();
1.2 Channel
Channel是进行通信的逻辑通道,类别有SocketChannel、ServerSocketChannel、DatagramChannel和FileChannel。
1.2.1 SocketChannel
连接到TCP网络套接字的通道。创建对象的方式:
SocketChannel socketChannel = SocketChannel.open();
1.2.2 ServerSocketChannel
打开并且绑定到一个ip地址和端口号上进行监听。
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bin(new InetSocketAddress(8888));
while(true) {
SocketChannel socketChannel = serverSocketChannel.accept();
// do something with socketChannel
}
1.3 Buffer
读channel时,读的数据放在Buffer中;写channel时,要写的数据先放在Buffer中。一般情况下,channel和buffer是一对一的关系。
Buffer有ByteBuffer、CharBuffer等不同类型。
1.4 SelectionKey
向Selector注册一个channel会返回对应的SelectionKey,它里面保存有该channel的状态信息。
1.5 这些对象之间的关系
一个线程一个Selector,这个Selector上可以注册多个SocketChannel,但是只有一个ServerSocketChannel并且它是不注册的,是它accept产生的新的SocketChannel需要注册。每个SocketChannel对应一个Buffer。
2 java nio使用实例