DatagramChannel
前面介绍了TCP协议的SocketChannel,接下来介绍一下UDP协议的DatagramChannel。DatagramChannel类也支持非阻塞式IO,同时支持数据的发送与接收,发送用send方法,接收用receive方法。因为前面SocketChannel做基础,这里不做过多解释,直接看代码示例。
服务端NIO模式代码:
try {
//打开选择器
Selector selector = Selector.open();
//初始化UDP通道
DatagramChannel dc = DatagramChannel.open();
//绑定地址端口号
dc.bind(new InetSocketAddress(8890));
//设置为非阻塞模式
dc.configureBlocking(false);
//注册可读时间
dc.register(selector, SelectionKey.OP_READ);
//选择器找出就绪的事件
while(selector.select() > 0){
//获取就绪事件集合的迭代器
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
while (iterator.hasNext()){
SelectionKey key = iterator.next();
//可读事件操作
if(key.isReadable()){
//初始化buffer
ByteBuffer buffer = ByteBuffer.allocate(30);
//接收数据
dc.receive(buffer);
}
//移除监听事件
iterator.remove();
}
}
} catch (IOException e) {
e.printStackTrace();
}
客户端阻塞式IO模型:
try {
//打开选择器
Selector selector = Selector.open();
//初始化UDP通道
DatagramChannel dc = DatagramChannel.open();
//初始化buffer
ByteBuffer b = ByteBuffer.allocate(14);
b.put("传个数据".getBytes());
//翻转
b.flip();
//发送数据
dc.send(b,new InetSocketAddress("127.0.0.1",8890));
dc.close();
} catch (IOException e) {
e.printStackTrace();
}
这一篇相对单薄,主要对DatagramChannel类做个介绍。至此我们吧java中NIO的基础类认识了一遍。下一篇我们来聊一下经典的Reactor反应器模式。