Java NIO中的DatagramChannel是一个可以收发UDP(User Datagram Protocol)包的channel。由于UDP是一个异步连接(面向无连接)的协议,因此你不能像那些channel一样使用默认的read和write方法。

打开一个DatagramChannel
调用open方法,然后绑定一个地址:
DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(9999));
接收数据
可以通过调用receive方法来接收:
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();
channel.receive(buf);
receive方法会把收到的数据包复制到buffer中。如果收到的数据大小超出了buffer的容量,就会默认丢包。
发送数据
调用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: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);
下一篇:【译】Java NIO Pipe
本文深入探讨了Java NIO中DatagramChannel的使用方法,包括如何打开和绑定地址,接收和发送UDP数据包,以及如何连接到指定地址进行更高级的操作。通过实例演示了DatagramChannel在异步连接模式下的读写操作。

被折叠的 条评论
为什么被折叠?



