前言
上一节,我们大致介绍了NIO的使用,现在利用一个客户端和服务端的代码重点看看
1、服务端和客户端的通道注册准备
1.1 服务端 、获取一个服务端的ServerSocketChannel通道并注册到Selector上
1、 SelectionKey设置为ServerSocketChannel准备好接收新连接
2、注意这里的通道是用的ServerSocketChannel
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
public class NIOServer {
// 通道管理器
private Selector selector;
public void initServer(int port) throws Exception {
// 获得一耳光通道管理器
this.selector = Selector.open();
// 获得一个ServerSocket通道
ServerSocketChannel serverChannel = ServerSocketChannel.open();
// 设置通道为 非阻塞
serverChannel.configureBlocking(false);
// 将该通道对于的serverSocket绑定到port端口
serverChannel.socket().bind(new InetSocketAddress(port));
// 将通道管理器和该通道绑定,并为该通道注册selectionKey.OP_ACCEPT事件
// 注册该事件后,当事件到达的时候,selector.select()会返回,
// 如果事件没有到达selector.select()会一直阻塞
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
}
}
1.2、客户端 获取一个SocketChannel通道并注册到Selector上
1、SelectKey设置为连接
2、注意这里的通道是用的SocketChannel
channel.register(selector, SelectionKey.OP_CONNECT);
public class NIOClient {
// 通道管理器
private Selector selector;
/**
* * // 获得一个Socket通道,并对该通道做一些初始化的工作 * @param ip 连接的服务器的ip // * @param