基本概念
- Java NIO中的DatagramChannel是一个能够收发UDP包的通道:
- UDP是一个无连接的网络协议,所以不能像其余通道那样读取和写入
- Java NIO中的DatagramChannel发送和接收的是数据包
DatagramChannel的开启
- 通过调用DatagramChannel.open() 方法打开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);