做過聊天軟件的大都接觸 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無法容納數據 也會丟失數據!!