DatagramChannel

2018-12-27  本文已影响0人  JiinYuu

Java NIO DatagramChannel是一种可以发送和接收UDP数据包的Channel。因为UDP是一个无连接的协议,所以默认情况下你不能像其他Channel一样对DatagramChannel读写数据。而是发送和接收数据包。

Opening a DatagramChannel

以下是如何打开一个DatagramChannel的例子:

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

上述例子演示了如何打开一个可以接收9999端口来的UDP数据包的DatagramChannel

Receiving Data

通过调用receive()方法,你可以从DatagramChannel接收数据,就像这样:

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

channel.receive(buffer);

receive()方法会将接收到数据包的数据拷贝到Buffer中。如果数据包中的数据超过了Buffer的容量,则多余的数据会被默默的丢掉。

Sending Data

你还可以通过调用DatagramChannelsend()方法来发送数据,就像这样:

String newData = "New String to write to file..." +  System.currentTimeMillis();
ByteBuffer buffer = ByteBuffer.allocate(48);
buffer.clear();
buffer.put(newData.getBytes());
buffer.flip();

int bytesSent = channel.send(buffer, new InetAddress("jenkov.com", 80));

本例将字符串数据发送到了“jenkov.com”服务器的UDP端口80上。但并没有任何程序在监听这个端口,所以什么也不会发生。你不会收到关于你发送的数据是否已被接收的通知,因为UDP对于数据的交付不做任何的保证。

Connecting to a Specific Address

DatagramChannel是可以“连接”到网络上特定地址的。因为UDP是无连接的,所以这种“连接”不是真正像TCP那样的和远程地址建立了一个连接。不如说是它将锁定你的DatagramChannel,以便你只能向一个特定的地址发送和接收数据包。

下面是个例子:

channel.connect(new InetAddress("jenkov.com", 80));

当“连接”建立后,你可以像使用传统的Channel一样调用read()write()方法。只是对于发送的数据,你不会得到任何关于交付的保证。下面是一些例子:

int bytesRead = channel.read(buffer);
int bytesWrite = channel.write(buffer);

发现貌似有人在看这个系列文章了,有必要说明下,这个Java NIO系列来源于jenkov.com,本文只是翻译,希望大家千万不要误会,本文不是原创。原文地址:Java NIO

上一篇下一篇

猜你喜欢

热点阅读