Java NIO DatagramChannel
精华
小牛编辑
97浏览
2023-03-14
Java NIO DatagramChannel是可以发送和接收UDP数据包的通道。由于UDP是无连接的网络协议,因此默认情况下,您不能仅从DatagramChannel其他通道读取和写入内容。相反,您发送和接收数据包。
1 打开一个DatagramChannel
这是打开方式DatagramChannel:
DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(9999));
本示例打开一个DatagramChannel,它可以在UDP端口9999上接收数据包。
2 接收数据
您可以DatagramChannel通过调用a的receive()方法从a接收数据,如下所示:
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
channel.receive(buf);
该receive()方法会将收到的数据包的内容复制到给定Buffer。如果接收到的数据包包含的数据量超出了数据包的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("xnip.cn", 80));
此示例将字符串发送到UDP端口80上的“ jenkov.com”服务器。尽管该端口上没有监听,所以将不会发生任何事情。由于UDP不保证数据的传送,因此不会通知您是否已收到发送数据包。
连接到特定地址
可以“连接”DatagramChannel到网络上的特定地址。由于UDP是无连接的,因此这种连接地址的方法不会像TCP通道那样建立真正的连接。而是,它锁定了您的身份,DatagramChannel因此您只能从一个特定地址发送和接收数据包。
这是一个例子:
channel.connect(new InetSocketAddress("xnip.cn", 80));
连接后,您也可以使用read()andwrite()方法,就像使用传统通道一样。您只是不能保证已发送数据的传递。这里有一些例子:
int bytesRead = channel.read(buf);
int bytesWritten = channel.write(buf);