Java NIO(十二) DatagramChannel

Java NIO DatagramChannel是可以发送和接收UDP数据包的通道。 由于UDP是无连接的网络协议,所以不能像从其他通道那样默认读取和写入DatagramChannel。 而是发送和接收数据包。

Opening a DatagramChannel

这里是你如何打开一个DatagramChannel:

DatagramChannel channel = DatagramChannel.open();
channel.socket().bind(new InetSocketAddress(9999));

这个例子打开一个DatagramChannel,它可以在UDP端口9999上接收数据包。

Receiving Data

您通过调用其receive()方法接收DatagramChannel的数据,如下所示:

ByteBuffer buf = ByteBuffer.allocate(48);
buf.clear();

channel.receive(buf);

receive()方法会将接收到的数据包的内容复制到给定的Buffer中。 如果收到的数据包中包含的数据多于缓冲区可以包含的数据,则剩下的数据将被静默丢弃。

Sending Data

您可以通过调用其send()方法通过DatagramChannel发送数据,如下所示:

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));

这个例子将字符串发送到UDP端口80上的“jenkov.com”服务器。虽然没有任何监听端口,所以什么都不会发生。 您不会收到发送数据包是否被接收的通知,因为UDP不保证数据的传送。

连接到一个特定的地址

可以将DatagramChannel“连接”到网络上的特定地址。 由于UDP是无连接的,所以这种连接到地址的方式不会像TCP通道那样创建真正的连接。 而是锁定你的DatagramChannel,所以你只能发送和接收来自一个特定地址的数据包。
Here is an example:

channel.connect(new InetSocketAddress("jenkov.com", 80));    

连接时,也可以使用read()和write()方法,就像使用传统通道一样。 您对发送的数据没有任何保证。 这里有一些例子:

int bytesRead = channel.read(buf);    
int bytesWritten = channel.write(buf);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值