.
DatagramChannel是可以发送与接收UDP数据包的channel。因为UDP是无连接的网络协议,所以你不能像操作其它channel那样对其读写。你需要发送或接收数据包。
开启DatagramChannel
Java代码
-
DatagramChannel channel = DatagramChannel.open();
-
channel.socket().bind(new InetSocketAddress(9999));
该示例代码开启了一个 DatagramChannel,可以从 9999 这个端口接收数据包。
接收数据包
Java代码
-
ByteBuffer buffer = ByteBuffer.allocate(1024);
-
buffer.clear();
-
channel.receive(buffer);
receive()方法会将所收到数据包中的数据拷贝到指定的buffer中。如果数据包的数据库量超过buffer的容量,多余的数据将被安静地丢弃。
发送数据
Java代码
-
// byte[] data = ...
-
ByteBuffer buffer = ByteBuffer.allocate(data.length);
-
buffer.clear();
-
buffer.put(data);
-
buffer.flip();
-
channel.send(buffer, new InetSocketAddress("abc.xyz", 80));
该示例代码向“abc.xyz”这个服务器的80端口发送了一些数据(data)。因为UDP不保证数据的传输,所以永远都不会得到数据包是否已被接收的通知。
还可以先指定一个固定的地址,后续都向该地址发送数据,或从该地址接收数据。
Java代码
-
channel.connect(new InetSocketAddress("abc.xyz", 80));
Java代码
-
channel.read(buffer);
Java代码
-
channel.write(buffer);