Java NIO DatagramChannel是一个能够发送和接受UDP包的通道。由于UDP是一个无连接的网络协议,因此不能像其他通道那样读取和写入。它发送和接受的都是数据包。
下面是一个打卡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()方法将接受的数据包内容复制到传入的Buffer中。如果接受的数据包内容比Buffer容量大,剩下的数据将会被丢弃。
调用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("jenkov.com", 80));
这个例子向“jenkov.com”服务器的UDP端口80发送字符串。那个端口没有监听,因此什么都不会发生。也不会知道发送包被发送了没有,UDP对数据的发送不做任何保证。
“连接”到互联网上一个指定地址上的DatagramChannel是有可能的。由于UDP是无连接的协议,这种连接到一个地址的方式并不会创建一个向TCP通道那样真正的连接,而是锁住DatagramChannel使其只能从特定地址收发数据,例如:
channel.connect(new InetSocketAddress("jenkov.com", 80));
连接上后,也能使用read()和write()方法,就像使用传统通道那样。但是对发送数据的丢失不做任何保证,例如:
int bytesRead = channel.read(buf);
int bytesWritten = channel.write(buf);