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的更多相关文章

  1. Java基础知识强化之IO流笔记81:NIO之 DatagramChannel

    1. Java NIO中的DatagramChannel是一个能收发UDP包的通道.因为UDP是无连接的网络协议,所以不能像其它通道那样读取和写入.它发送和接收的是数据包. 2. DatagramCh ...

  2. Java NIO -- DatagramChannel

    Java NIO中的DatagramChannel是一个能收发UDP包的通道.操作步骤:打开 DatagramChannel接收/发送数据 代码举例: package com.soyoungboy.n ...

  3. DatagramChannel

    DatagramChannel 最后一个socket通道是DatagramChannel.正如SocketChannel对应Socket,ServerSocketChannel对应ServerSock ...

  4. 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 ...

  5. 使用JAVA NIO实现的UDP client和server

    //////////////////////////////////////////////////////////////////////////////////////////////////// ...

  6. JAVA NIO学习三:NIO 的非阻塞式网络通信

    紧接着上一章,我们继续来研究NIO,上一章中我们讲了NIO 中最常见的操作即文件通道的操作,但实际上NIO的主要用途还是在于网络通信,那么这个时候就会涉及到选择器,这一章我们就会对其进行讲解操作. 一 ...

  7. JAVA NIO工作原理及代码示例

    简介:本文主要介绍了JAVA NIO中的Buffer, Channel, Selector的工作原理以及使用它们的若干注意事项,最后是利用它们实现服务器和客户端通信的代码实例. 欢迎探讨,如有错误敬请 ...

  8. NIO的初步入门

    NIO java NIO简介 Java NIO 简介 是从java1.4版本开始引入的一个新的IO AP可以替代标准java  IO API NIO与原来的IO有同样的作用和目的,但是使用方式完全不同 ...

  9. 理解Java的NIO

    同步与阻塞 同步和异步是针对应用程序和内核的交互而言的. 同步:执行一个操作之后,进程触发IO操作并等待(阻塞)或者轮询的去查看IO的操作(非阻塞)是否完成,等待结果,然后才继续执行后续的操作. 异步 ...

随机推荐

  1. 日期 function

    SELECT SYSDATE, ADD_MONTHS(SYSDATE,), ADD_MONTHS(SYSDATE,), LAST_DAY(SYSDATE), MONTHS_BETWEEN(SYSDAT ...

  2. Xamarin XAML语言教程构建ControlTemplate控件模板 (三)

    Xamarin XAML语言教程构建ControlTemplate控件模板 (三) (3)打开MainPage.xaml.cs文件,编写代码,实现主题的切换功能.代码如下: using System; ...

  3. POJ 2186 Popular Cows(强连通分量)

    [题目链接] http://poj.org/problem?id=2186 [题目大意] 给出一张有向图,问能被所有点到达的点的数量 [题解] 我们发现能成为答案的,只有拓扑序最后的SCC中的所有点, ...

  4. 【R笔记】R的内存管理和垃圾清理

    笔记: 1.R输入命令时速度不要太快,终究是个统计软件,不是编程! 2.memory.limit()查看当前操作系统分配内存给R的最大限度(单位是M?) 3.要经常 rm(object) 或者 rm( ...

  5. 百度地图API的事件处理:覆盖物的如何阻止冒泡

    百度地图,为了让事件使用的更方便,进行一层封装 详情可以看官方的文档 http://developer.baidu.com/map/jsdevelop-5.htm 主要的修改点: 1. 使用事件代理. ...

  6. vb6转16进制

    Public Function xEncode(ByVal strEncode As String) As String If strEncode <> "" Then ...

  7. Intellij IDEA System.out.println输出中文乱码问题

    进行下列设置即可:

  8. 【转】谈基于SOA的应用系统设计和开发

    注:在网上看到这篇文档,觉得写得很好,清晰实用.该博客其它文章也写得不错     地址:http://blog.sina.com.cn/s/blog_493a84550101gswn.html 现在对 ...

  9. htmltestrunner解决错误日志出界问题

    扩大背后的区域放大,让它看起来没有出界 .popup_window {    display: none;    position: relative;    left: 0px;    top: 0 ...

  10. gcc编译错误:DSO missing from command line

    在用gcc 编译连接的时候,可能会遇到类似以下的错误: /usr/bin/ld: test_desktop_utils-test-desktop-utils.o: undefined referenc ...