Socket通信模型简化下来很简单,主要有建立连接、维护连接、读、写。NIO作为基于事件模型实现,这些职责都以事件的形式表达,所以NIO关注的事件有:
SelectionKey.OP_ACCEPT
SelectionKey.OP_CONNECT
SelectionKey.OP_READ
SelectionKey.OP_WRITE
每一个键表达了与之对应操作相关的一类事件。
要监听事件,则必须有注册监听与接收通知的地方,NIO的实现不同于平时见到的Listener模式,它是通过向Selector(轮询器)注册,通过遍历selector.selectedKeys()来获取事件通知。
注册:
serverChannel.register(selector, SelectionKey.OP_ACCEPT);
获取通知:
while (true) {
//当注册的事件到达时,方法返回;否则,该方法会一直阻塞
selector.select();
// 获得selector中选中的项的迭代器,选中的项为注册的事件
Iterator ite = this.selector.selectedKeys().iterator();
while (ite.hasNext()) {
SelectionKey key = (SelectionKey) ite.next();
// do some thing
}
}
通过SelectionKey可以判断事件的类型,进行事件处理,也可以获取Channel进行读写数据。
那么selector怎么得来呢?见代码:
selector = Selector.open();
最初始用于注册监听的Channel:
服务端:
ServerSocketChannel serverChannel = ServerSocketChannel.open();
serverChannel.configureBlocking(false);
serverChannel.socket().bind(new InetSocketAddress(port));
客户端:
SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false);
channel.connect(new InetSocketAddress(ip,port));
大概的结构就介绍完了,网上找个例子好好看看吧。