首页
学习
活动
专区
圈层
工具
发布

Java NIO-10.DatagramChannel

Java NIO DatagramChannel是一个能够发送和接受UDP包的通道。由于UDP是一个无连接的网络协议,因此不能像其他通道那样读取和写入。它发送和接受的都是数据包。

打开一个DatagramChannel

下面是一个打卡DatagramChannel的例子:

代码语言:javascript
复制
DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(9999));

这个例子打开了一个DatagramChannel,能从UDP端口9999接受数据。

接受数据

调用DatagramChannel的receive()方法接受数据,例如:

代码语言:javascript
复制
ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();

channel.receive(buf);

receive()方法将接受的数据包内容复制到传入的Buffer中。如果接受的数据包内容比Buffer容量大,剩下的数据将会被丢弃。

发送数据

调用DatagramChannel的send()方法发送数据,例如:

代码语言:javascript
复制
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使其只能从特定地址收发数据,例如:

代码语言:javascript
复制
channel.connect(new InetSocketAddress("jenkov.com", 80));   

连接上后,也能使用read()和write()方法,就像使用传统通道那样。但是对发送数据的丢失不做任何保证,例如:

代码语言:javascript
复制
int bytesRead = channel.read(buf);    
int bytesWritten = channel.write(buf);    
下一篇
举报
领券