Java中的NIO详解Day10-Java NIO DatagramChannel

基本概念

  • Java NIO中的DatagramChannel是一个能够收发UDP包的通道:
    • UDP是一个无连接的网络协议,所以不能像其余通道那样读取和写入
  • Java NIO中的DatagramChannel发送和接收的是数据包

DatagramChannel的开启

  • 通过调用DatagramChannel.open() 方法打开DatagramChannel:
/*
 * 打开可以在UDP端口8888上收发数据包的DatagramChannel
 */
 DatagramChannel datagramChannel = DatagramChannel.open();
 datagramChannel.socket().bind(new InetSocketAddress(8888));

DatagramChannel接收数据

  • 通过调用DatagramChannel.receive() 方法从DatagramChannel中接收数据:
ByteBuffer byteBuffer = ByteBuffer.allocate(128);
byteBuffer.clear();
datagramChannel.receive(byteBuffer);
  • receive() 方法将接收到的数据包内容复制到指定的Bufffer
  • 如果Buffer容量不够接收收到的数据,多出的数据将被丢弃

DatagramChannel发送数据

  • 通过调用DatagramChannel.send() 方法向DatagramChannel中发送数据:
ByteBuffer byteBuffer = ByteBuffer.allocate(128);
byteBuffer.clear();
byteBuffer.put(datas.getBytes());
byteBuffer.flip();
int bytesSend = datagramChannel.send(new InetSocketChannelAddress(url, 80));
  • 发送数据到地址为url服务器的UDP端口80
    • 因为服务端并没有监听这个端口,所以什么也不会发生
    • 不会通知发出的数据包是否收到,因此UDP在数据传送方面没有任何保证

DatagramChannel连接到特定的地址

  • 可以将DatagramChannel连接到网络中特定的地址:
    • 因为UDP是无连接的,连接到特定的地址并不会像TCP那样通道创建一个真正的连接
    • 而是锁住DatagramChannel, 使得DatagramChannel只能从特定的地址收发数据
datagramChannel.connect(new InetSocketChannelAddress(url, 80));
  • 连接后,也可以使用read() 方法和write() 方法,和传统的通道一样.只是在数据传输方面没有任何保证
int bytesRead = datagramChannel.read(byteBuffer);
int bytesWrite = datagramChannel.write(byteBuffer);

猜你喜欢

转载自blog.csdn.net/JewaveOxford/article/details/107761132
NIO