nio socket是非阻塞的通訊模式,與io阻塞式的通訊不同點在於nio的資料要通過channel放到乙個快取池bytebuffer中,然後再從這個緩衝池中讀出資料,而io的模式是直接從inputstream中read。所以對於nio,由於存在緩衝池的大小限制和網速的不均勻會造成一次讀的操作放入快取池中的資料不完整,便形成了斷包問題。同理,如果一次性讀入兩個及兩個以上的資料,則無法分辨兩個資料報的界限問題,也就造成了粘包。對於nio的socketchannel每次觸發op_read事件時,傳送端不一定僅僅寫入了一次,同理,傳送端如果一次傳送資料報過大,那麼傳送端的一次寫入也可能會被拆分成兩次op_read事件,所以op_read事件和傳送端的op_write事件並不是一一對應的。
解決思路:
定義資料傳送協議格式,資料頭中包含包體的長度大小,接收方首先讀取包體的長度,然後按照包體的長度進行一次或多次讀取資料,從而組裝成完整合法的資料內容。
tcp粘包,斷包問題及處理
做過乙個五子棋大作戰遊戲,當時用socket長連線在人人聯網對戰時進行處理,但在遊戲過程中總會出現兩個下棋的人接收不到對方棋子的落點的資訊,這就是典型的出現了tcp粘包問題。下來進行具體說明。1.理解nagle演算法 當傳送方每次傳送的資料報都比較小時,而這種小的資料報又比較多時,就會導致網路擁塞,...
socket中tcp的斷包 粘包處理方法
socket中tcp的斷包和粘包都是tcp協議中出現的問題。乙太網中存在乙個對於幀的有效資料大小的限制,即mtu,乙太網的mtu為1500位元組。所謂斷包的意思就是說傳送端一次傳送的訊息長度過大,如果超過了mtu,那麼ip會對其進行分片。在網路程式設計中,我們要避免出現ip分片,那麼為什麼要避免呢?...
處理tcp粘包問題
tcp是位元組流,無邊界,udp是訊息,是有邊界的。就是udp返回的就是乙個訊息。所以tcp會產生粘包問題。如何解決粘包問題,所以我們要在應用層維護訊息與訊息的邊界。比如說定長包,包尾加 r n ftp 包頭加包體長度,更複雜的應用層協議。readn接受確切資料的讀操作 cli include in...