做过聊天软件的大都接触 DatagramSocket 这个类,
DatagramChannel是非阻塞形式
然而 非阻塞形式 对于发送数据 可能经常会出现错误
DatagramChannel 的发送数据形式 有两种形式
第一种
:send(ByteBuffer )
:receive(ByteBuffer)
分析下send 方法 的发送过程
假定 ByteBuffer 中剩余字节数 为n 那么send方法就会把 n个字节作为一个 数据包发送,如果发送成功就返回n
如果底层网络的发送缓冲区没有足够的空间容纳要发送数据包,并且datagramChannel出于非阻塞模式,
那么send 不会发送任何字节
这就是 非阻塞模式的特点。。。。不会等待。。。直接返回。。。
接收数据的方法 receive 的ByteBuffer 要尽量大!如果接受的数据报大于 ByteBuffer的大小 ,那数据就会丢失,并且不会抛出异常!!
还有一种方法
发送 :write(ByteBuffer[]) 前提要求DataChannel已经建立连接!!也就是之前必须通过Connect(SocketAddress)建立了连接
在非阻塞模式下,不会保证所有的数据作为一个数据报发送,他可能把一个数据报(例如大小为n)拆分成几份发送
所以 要向都发送,可以用下面的方法
while(buffer.hasRemaining()&&channel.write(buffer)!=-1);
接受:read(ByteBuffer[])
与receive的区别也是前者得建立连接!!
如果BYteBuffer无法容纳数据 也会丢失数据!!