NIO之DatagramChannel
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
NIO之DatagramChannel的更多相关文章
- Java基础知识强化之IO流笔记81:NIO之 DatagramChannel
1. Java NIO中的DatagramChannel是一个能收发UDP包的通道.因为UDP是无连接的网络协议,所以不能像其它通道那样读取和写入.它发送和接收的是数据包. 2. DatagramCh ...
- Java NIO -- DatagramChannel
Java NIO中的DatagramChannel是一个能收发UDP包的通道.操作步骤:打开 DatagramChannel接收/发送数据 代码举例: package com.soyoungboy.n ...
- DatagramChannel
DatagramChannel 最后一个socket通道是DatagramChannel.正如SocketChannel对应Socket,ServerSocketChannel对应ServerSock ...
- An NIO.2 primer--reference
Part 1: The asynchronous channel APIs The More New I/O APIs for the Java™ Platform (NIO.2) is one of ...
- 使用JAVA NIO实现的UDP client和server
//////////////////////////////////////////////////////////////////////////////////////////////////// ...
- JAVA NIO学习三:NIO 的非阻塞式网络通信
紧接着上一章,我们继续来研究NIO,上一章中我们讲了NIO 中最常见的操作即文件通道的操作,但实际上NIO的主要用途还是在于网络通信,那么这个时候就会涉及到选择器,这一章我们就会对其进行讲解操作. 一 ...
- JAVA NIO工作原理及代码示例
简介:本文主要介绍了JAVA NIO中的Buffer, Channel, Selector的工作原理以及使用它们的若干注意事项,最后是利用它们实现服务器和客户端通信的代码实例. 欢迎探讨,如有错误敬请 ...
- NIO的初步入门
NIO java NIO简介 Java NIO 简介 是从java1.4版本开始引入的一个新的IO AP可以替代标准java IO API NIO与原来的IO有同样的作用和目的,但是使用方式完全不同 ...
- 理解Java的NIO
同步与阻塞 同步和异步是针对应用程序和内核的交互而言的. 同步:执行一个操作之后,进程触发IO操作并等待(阻塞)或者轮询的去查看IO的操作(非阻塞)是否完成,等待结果,然后才继续执行后续的操作. 异步 ...
随机推荐
- 【Android】自定义View
内置组件经常不满足我们的需求,那么就要自己来重写了,一般需要实现以下几个父类方法: 1.onMeasure 决定内部View的宽和高,以及自身的宽和高 2.onLayout 决定子View的放置位置 ...
- 8.4(Java学习笔记)java脚本引擎(Rhino)
一.java脚本引擎 java脚本引擎是沟通java和脚本语句之间的桥梁,可以通过对应的脚本引擎在java中调用各种脚本语言. 二.脚本引擎执行脚本代码 ScriptEngineManager:为Sc ...
- 键盘事件OnKeyListener
1.效果图:就是在文本框中输入A,则显示A,输入B,则显示B.... (1)activity_main.xml <?xml version="1.0" encoding=&q ...
- Metesploit使用随笔
平时在工作中真正用到metesploit机会不多,偶尔也会用来做漏洞验证,但是每次使用的时候都需要花点时间回忆一下具体是怎么用的,因此索性记下来方便自己,以使用Nessus扫描YS的某个硬件设备发现的 ...
- menuStrip鼠标经过自动显示菜单
//--------------------------------------------------------------------------------- private void For ...
- zk介绍
1. 配置管理 Zookeeper提供了这样的一种服务:一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有对这个配置感兴趣的都可以获得变更.这样就省去手动拷贝配置了,还保证了可靠和一致性. ...
- Java汉字md5值不一致问题
原文:http://blog.csdn.net/earthhour/article/details/51188437 通过main方法测试得到一个加密值,通过servlet request调用得到一个 ...
- javascript快速入门20--Cookie
Cookie 基础知识 我们已经知道,在 document 对象中有一个 cookie 属性.但是 Cookie 又是什么?“某些 Web 站点在您的硬盘上用很小的文本文件存储了一些信息,这些文件就称 ...
- Actionscript 3 自定义 matedata
metadata就是元数据 反应一个类本质的属性 可以通过describeType(obj)来得到反应该对象的xml 要自定义元数据,如[MyMatedata()] package { public ...
- Windows下搭建基于SSH的Git服务器
Git客户端安装 客户端要同时安装在远程服务器和自己的电脑上,下载地址:http://msysgit.github.io/ 选择安装组件 :也可以默认选择; 图标组件(Addition icons) ...