前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java NIO-10.DatagramChannel

Java NIO-10.DatagramChannel

作者头像
悠扬前奏
发布2019-05-30 20:19:19
3710
发布2019-05-30 20:19:19
举报

Java NIO DatagramChannel是一个能够发送和接受UDP包的通道。由于UDP是一个无连接的网络协议,因此不能像其他通道那样读取和写入。它发送和接受的都是数据包。

打开一个DatagramChannel

下面是一个打卡DatagramChannel的例子:

代码语言:javascript
复制
DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(9999));

这个例子打开了一个DatagramChannel,能从UDP端口9999接受数据。

接受数据

调用DatagramChannel的receive()方法接受数据,例如:

代码语言:javascript
复制
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();

channel.receive(buf);

receive()方法将接受的数据包内容复制到传入的Buffer中。如果接受的数据包内容比Buffer容量大,剩下的数据将会被丢弃。

发送数据

调用DatagramChannel的send()方法发送数据,例如:

代码语言:javascript
复制
String newData = "New String to write to file..."
                    + System.currentTimeMillis();
    
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
buf.put(newData.getBytes());
buf.flip();

int bytesSent = channel.send(buf, new InetSocketAddress("jenkov.com", 80));

这个例子向“jenkov.com”服务器的UDP端口80发送字符串。那个端口没有监听,因此什么都不会发生。也不会知道发送包被发送了没有,UDP对数据的发送不做任何保证。

连接到指定地址

“连接”到互联网上一个指定地址上的DatagramChannel是有可能的。由于UDP是无连接的协议,这种连接到一个地址的方式并不会创建一个向TCP通道那样真正的连接,而是锁住DatagramChannel使其只能从特定地址收发数据,例如:

代码语言:javascript
复制
channel.connect(new InetSocketAddress("jenkov.com", 80));   

连接上后,也能使用read()和write()方法,就像使用传统通道那样。但是对发送数据的丢失不做任何保证,例如:

代码语言:javascript
复制
int bytesRead = channel.read(buf);    
int bytesWritten = channel.write(buf);    
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.06.04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 打开一个DatagramChannel
  • 接受数据
  • 发送数据
  • 连接到指定地址
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档