Java NIO 中的 DatagramChannel 是一个可以发送、接收 UDP 数据包的通道。由于 UDP 是面向无连接的网络协议,所以不能像使用其他通道那样直接进行读写数据。正确的做法是发送、接收数据包。
阅读文章的过程中如果有任何疑问,欢迎添加笔者为好友,拉您进【七日书摘】微信交流群,一起交流技术,一起打造高质量的职场技术交流圈子,抱团取暖,共同进步。
打开一个 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)
参考资源:
https://blog.csdn.net/Andrew_Yuan/article/details/80215164
https://wiki.jikexueyuan.com/project/java-nio-zh/java-nio-datagramchannel.html