Java NIO(十二) DatagramChannel

简介: Java NIO DatagramChannel是可以发送和接收UDP数据包的通道。 由于UDP是无连接的网络协议,所以不能像从其他通道那样默认读取和写入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);
相关文章
|
6天前
|
存储 Java 数据处理
|
6天前
|
Java API
java中IO与NIO有什么不同
java中IO与NIO有什么不同
|
6天前
|
监控 Java
Java一分钟之-NIO:非阻塞IO操作
【5月更文挑战第14天】Java的NIO(New IO)解决了传统BIO在高并发下的低效问题,通过非阻塞方式提高性能。NIO涉及复杂的选择器和缓冲区管理,易出现线程、内存和中断处理的误区。要避免这些问题,可以使用如Netty的NIO库,谨慎设计并发策略,并建立标准异常处理。示例展示了简单NIO服务器,接收连接并发送欢迎消息。理解NIO工作原理和最佳实践,有助于构建高效网络应用。
9 2
|
6天前
|
缓存 Java API
Java NIO和IO之间的区别
NIO(New IO),这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
17 1
|
6天前
|
监控 Java 开发者
深入理解 Java 网络编程和 NIO
【4月更文挑战第19天】Java网络编程基于Socket,但NIO(非阻塞I/O)提升了效率和性能。NIO特点是非阻塞模式、选择器机制和缓冲区,适合高并发场景。使用NIO涉及通道、选择器和事件处理,优点是高并发、资源利用率和可扩展性,但复杂度、错误处理和性能调优是挑战。开发者应根据需求选择是否使用NIO,并深入理解其原理。
|
6天前
|
存储 监控 Java
浅谈Java NIO
浅谈Java NIO
7 0
|
6天前
|
消息中间件 存储 Java
【Java NIO】那NIO为什么速度快?
是这样的,在NIO零拷贝出现之前,一个I/O操作会将同一份数据进行多次拷贝。可以看下图,一次I/O操作对数据进行了四次复制,同时来伴随两次内核态和用户态的上下文切换,众所周知上下文切换是很耗费性能的操作。
31 1
【Java NIO】那NIO为什么速度快?
|
6天前
|
存储 监控 Java
Java输入输出:什么是NIO(New I/O)?
Java NIO是一种高效I/O库,特征包括非阻塞性操作、通道(如文件、网络连接)、缓冲区和选择器。选择器监控通道状态变化,通知应用程序数据可读写,避免轮询,提升性能。示例代码展示了一个使用NIO的服务器,监听连接、读取数据并处理客户端通信。
14 1
|
6天前
|
移动开发 编解码 网络协议
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
用Java的BIO和NIO、Netty来实现HTTP服务器(三) 用Netty实现
|
6天前
|
网络协议 Java Linux
用Java来实现BIO和NIO模型的HTTP服务器(二) NIO的实现
用Java来实现BIO和NIO模型的HTTP服务器(二) NIO的实现