Java NIO DatagramChannel是可以发送和接收UDP数据包的通道,由于UDP是无连接的网络协议,因此默认情况下,不能像从其他通道一样对DatagramChannel进行读写,但可以发送和接收数据包。
1.打开DatagramChannel
DatagramChannel channel = DatagramChannel.open(); channel.socket().bind(new InetSocketAddress(9999));
本示例打开一个DatagramChannel,它可以在端口9999上接收数据包。
2.接收数据
可以通过调用DatagramChannel的receive()方法从DatagramChannel接收数据:
ByteBuffer buf = ByteBuffer.allocate(48); buf.clear(); channel.receive(buf);
receive()方法会将接收到的数据包内容复制到给定的Buffer中,如果接收到的数据包包含的数据量超过缓冲区可以容纳的数据量,则其余数据将被丢弃。
3.发送数据
可以通过调用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("baidu.com", 80));
4.连接到指定的地址
可以将DatagramChannel“连接”到网络上的特定地址。由于UDP是无连接的,因此这种连接地址的方法不会像TCP通道那样建立真正的连接,而是它锁定了DatagramChannel,因此只能从一个特定地址发送和接收数据包。
这是一个例子:
channel.connect(new InetSocketAddress("baidu.com", 80));
连接后,也可以使用read()和write()方法,就像使用传统通道一样,只是不能保证数据的发送:
int bytesRead = channel.read(buf); int bytesWritten = channel.write(buf);
原文地址: https://www.zhblog.net/go/java/tutorial/java-nio-datagram-channel?t=621