Java NIO DatagramChannel

时间:2020-01-09 10:36:15  来源:igfitidea点击:

Java NIO DatagramChannel是可以发送和接收UDP数据包的通道。由于UDP是一种无连接的网络协议,因此默认情况下,我们不能像从其他通道那样对DatagramChannel进行读写操作。相反,我们发送和接收数据包。

打开一个DatagramChannel

这是打开DatagramChannel的方法:

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

这个示例打开了一个" DatagramChannel",它可以在UDP端口9999上接收数据包。

接收资料

我们可以通过调用DatagramChannel的receive()方法来接收数据,如下所示:

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

channel.receive(buf);

" receive()"方法会将接收到的数据包的内容复制到给定的"缓冲区"中。如果接收到的数据包包含的数据量超过"缓冲区"可以包含的数据量,则其余数据将被静默丢弃。

传送资料

我们可以通过调用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("Hyman.com", 80));

本示例将字符串发送到UDP端口80上的" Hyman.com"服务器。但是,该端口上没有任何内容在监听,因此不会发生任何事情。由于UDP不能保证数据的传送,因此不会通知我们是否已收到发送数据包。

连接到特定地址

可以将" DatagramChannel""连接"到网络上的特定地址。由于UDP是无连接的,因此这种连接地址的方法不会像TCP通道那样建立真正的连接。相反,它锁定了" DatagramChannel",因此我们只能从一个特定地址发送和接收数据包。

这是一个例子:

channel.connect(new InetSocketAddress("Hyman.com", 80));

连接后,我们也可以使用read()和write()方法,就像使用传统通道一样。我们只是不能保证已发送数据的传递。这里有一些例子:

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