Java NIO 中的 DatagramChannel 是一个可以发送、接收 UDP 数据包的通道。由于 UDP 是面向无连接的网络协议,所以不能像使用其他通道那样直接进行读写数据。正确的做法是发送、接收数据包。

阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进【七日书摘】微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
七日书摘官方群.jpg

打开一个 DatagramChannel(Opening a DatagramChannel)

DatagramChannel 打开方式如下:

DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(9999));

上述示例中,打开了一个 DatagramChannel,它可以在 9999 端口上收发 UDP 数据包。

接收数据(Receiving Data)

你可以直接调用 DatagramChannel 的 receive() 方法进行接收数据。示例如下:

ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();

channel.receive(buf);

receive() 方法会把接收到的数据包中的数据拷贝到指定给定的 Buffer 中。如果数据包的内容超过了 Buffer 的大小,多出的数据会被直接丢弃。

发送数据(Sending Data)

你可以直接调用 DatagramChannel 的 send() 方法进行发送数据。示例如下:

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("qirishuzhai.com", 8080));

上述示例会把一个字符串发送到 “qirishuzhai.com” 服务器的 UDP 端口 8080。目前这个端口没有被任何程序监听,所以什么都不会发生。当发送了数据后,我们不会收到数据包是否被接收的的通知,这是由于 UDP 在数据方面没有任何保证。

链接指定机器地址(Connecting to a Specific Address)

DatagramChannel 实际上是可以指定到网络中的特定地址的。由于 UDP 是面向无连接的,这种连接方式并不会像 TCP 通道那样创建一个真正的连接。确切的说会锁定 DatagramChannel,这样我们就只能通过特定的地址来收发数据包。

看如下示例:

channel.connect(new InetSocketAddress("qirishuzhai.com", 8080));

当连接后,可以像使用传统的通道那样调用 read() 和 Writer() 方法。区别是数据的读写情况得不到保证。

如下示例:

int bytesRead = channel.read(buf);
int bytesWritten = channel.write(buf);

英文原文链接:http://tutorials.jenkov.com/java-nio/datagram-channel.html

------完------

推荐阅读:

Java NIO 简明教程 之 Java NIO 选择器(Selector)

Java NIO 简明教程 之 Java NIO 文件通道(FileChannel)

Java NIO 简明教程 之 Java NIO 套接字通道(SocketChannel)

Java NIO 简明教程 之 Java NIO 服务端套接字通道(ServerSocketChannel)

Java NIO 简明教程 之 Java NIO 非阻塞式服务器(Non-blocking Server)

Java基础知识面试题篇(2020年2月最新版)

更技术学习请进入七日书摘官方群: 七日书摘官方群

七日书摘官方群群聊二维码.png

参考资源:
https://blog.csdn.net/Andrew_Yuan/article/details/80215164
https://wiki.jikexueyuan.com/project/java-nio-zh/java-nio-datagramchannel.html