Java NIO中的DatagramChannel是一个能收发UDP包的通道。
操作步骤:
  1)打开 DatagramChannel
  2)接收/发送数据

同样它也支持NIO的非阻塞模式操作,例如:

public static void main(String[] args){
new Thread(new Runnable() {
@Override
public void run() {
server();
}
}).start(); new Thread(new Runnable() {
@Override
public void run() {
client();
}
}).start();
} // udp,非阻塞io,客户端
public static void client(){
DatagramChannel datagramChannel = null;
try {
// 1.获取通道
datagramChannel = DatagramChannel.open();
// 2.置为非阻塞模式
datagramChannel.configureBlocking(false);
// 3.分配缓冲区
ByteBuffer byteBuffer = ByteBuffer.allocate(1024); while (true) {
Thread.sleep(3000);
// 4.向缓冲区放数据
byteBuffer.put(("时间:"+CommonUtil.getDateTime()+",编号:"+UUID.randomUUID().toString()).getBytes());
byteBuffer.flip();
// 5.通道向服务端发送
datagramChannel.send(byteBuffer, new InetSocketAddress("127.0.0.1", 2787));
byteBuffer.clear();
}
} catch (Exception ex) {
ex.printStackTrace();
} finally{
if (datagramChannel!=null) {
try {
datagramChannel.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}
// udp,非阻塞io,服务端
public static void server(){
DatagramChannel datagramChannel = null;
try {
// 1.获取通道
datagramChannel = DatagramChannel.open();
// 2.置为非阻塞模式
datagramChannel.configureBlocking(false);
// 3.绑定监听端口
datagramChannel.bind(new InetSocketAddress(2787));
// 4.获取选择器
Selector selector = Selector.open();
// 5.通道注册选择器
datagramChannel.register(selector, SelectionKey.OP_READ);
// 5.获取选择器上的已选择的键
while (selector.select()>0) {
Iterator<SelectionKey> it = selector.selectedKeys().iterator();
while (it.hasNext()) {
SelectionKey skey = it.next();
// 7.判断当前键的监听事件
if (skey.isConnectable()) {
System.out.println("connectable");
}else if (skey.isAcceptable()) {
System.out.println("acceptable");
}else if (skey.isReadable()) {
System.out.println("readable");
ByteBuffer mBuffer = ByteBuffer.allocate(1024);
datagramChannel.receive(mBuffer);
mBuffer.flip();
System.out.println("receive:"+new String(mBuffer.array(), 0, mBuffer.array().length));
mBuffer.clear();
}
}
it.remove();
}
} catch (Exception ex) {
ex.printStackTrace();
} finally{
if (datagramChannel!=null) {
try {
datagramChannel.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}
}

结果

readable
receive:时间:2017-01-01 19:01:46,编号:63feeb8f-7ead-4e2f-a65b-8471ef3940e3
readable
receive:时间:2017-01-01 19:01:46,编号:63feeb8f-7ead-4e2f-a65b-8471ef3940e4
readable
receive:时间:2017-01-01 19:01:46,编号:63feeb8f-7ead-4e2f-a65b-8471ef3940e5
readable
receive:时间:2017-01-01 19:01:46,编号:63feeb8f-7ead-4e2f-a65b-8471ef3940e6

最新文章

  1. RESTful Api 身份认证安全性设计
  2. 05.virsh命令的常用操作(kvm)
  3. 读取另一个项目中方法的json
  4. EmguCV 一些结构
  5. centos桌面使用
  6. Linux下编译安装PCRE库
  7. TF Boys (TensorFlow Boys ) 养成记(六)
  8. (六)6.4 Neurons Networks Autoencoders and Sparsity
  9. Android系统SVC命令教程
  10. Fedora安装
  11. jQuery修改操作css属性实现方法
  12. Linux环境下添加ftp账号步骤
  13. Spring MVC 解读——View,ViewResolver(转)
  14. Ubuntu16.04LTS安装
  15. HTML禁止使用右键
  16. MySQL导入乱码解决
  17. C#100万条数据导入SQL SERVER数据库仅用4秒 (附源码)
  18. 二cha树
  19. CUSTOM.PLL的使用
  20. CODEVS 3546 矩阵链乘法

热门文章

  1. Oracle SQL*Loader commit point tips
  2. 在MYSQL中插入当前时间,就象SQLSERVER的GETDATE()一样,以及对mysql中的时间日期操作。
  3. ubuntu 修改权限
  4. luogu P1095 守望者的逃离
  5. [SPOJ]COT2
  6. 【Heap-Dijkstra】【分层图】bzoj2763 [JLOI2011]飞行路线
  7. 【可持久化Trie】模板
  8. 【动态规划】【记忆化搜索】CODEVS 1010 过河卒 2002年NOIP全国联赛普及组
  9. 1.3(Mybatis学习笔记)动态SQL
  10. AngularJS的加载执行过程