NIO如今有NIO 2了,新版本有对MulticastSocket的支持。这篇对NIO使用作些简单的记录以备后用。 socket
ServerSocketChannel,SocketChannel,DatagramChannel是常见的三个功能类,称为通道类,能够运行非阻塞模式而且是能够选择的。在Socket通讯中,“阻塞”意味着在某操做没有完成之间,不能进行其它操做。所以,对于多客户端来讲,服务端须要为每个客户端建立一个线程处理用户需求,这样消耗比较大。 线程
在NIO中,使用Selector对象对向它注册过的channel进行轮询,一次轮询返回全部注册事件发生的channel的key。用一个迭代器,咱们能够在一次轮询中处理相关的channel请求。 对象
ServerSocketChannel负责监听传入的链接和建立新的SocketChannel对象,自己不传递数据;SocketChannel和DatagramChannel负责定义读和写功能的接口。 接口
下面是基本的使用代码: 事件
Selector selector=Selector.open();//该方法打开一个选择器 ip
SocketChannel channel=SocketChannel.open(new InetSocketAddress(ip,port)); rem
channel.configureBlocking(false);//设置为非阻塞模式 get
SelectionKey channelkey=channel.register(selector,SelectionKey.OP_READ);//channelkey能够在下面的轮询中来分别出是哪个具体的channel,从而能够进行特定的操做 it
...... io
DatagramChannel的用法基本相同,datagramchannel用于非链接,socketchannel用于链接
具体轮询的代码以下:
while(true){
if (selector.select(getTimeout()) != 0) {//getTimeout()为超时时间
Iterator<SelectionKey> it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey key = it.next();
if(key.isReadable()){
......
}
if(key.isWritable()){
......
}
if(key.isAcceptable()){
......
}
it.remove();
}
}
}
在代码中能够处理具体需求。