DatagramChannel
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
你还可以通过调用DatagramChannel
的send()
方法来发送数据,就像这样:
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。