【译】Java NIO DatagramChannel

本文深入探讨了Java NIO中DatagramChannel的使用方法,包括如何打开和绑定地址,接收和发送UDP数据包,以及如何连接到指定地址进行更高级的操作。通过实例演示了DatagramChannel在异步连接模式下的读写操作。

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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值