DatagramSocket的方法簡單知識

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

發佈了26 篇原創文章 · 獲贊 7 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章