当前位置: 首页 > 教程 > Java NIO >

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);