2012-03-22 30 views
1

從套接字接收數據有奇怪的問題。 在客戶端即時通訊使用空氣插座。在服務器Java netty上。 即時消息寫入套接字簡單包:int numPacket,int textLength,utf8String文本。並閱讀客戶端。套接字。當我需要數據包時,數據包保持隊列狀態

//server 
buffer.writeInt(packetId); 
ChannelBuffer ch = ChannelBuffers.copiedBuffer(text, CharsetUtil.UTF_8); 
buffer.writeInt(text.length()); 
buffer.writeBytes(ch); 

//client 
packetId = socket.readInt() 
packetLen = socket.readInt() 
text = socket.readUtfBytes(packetLen) 

有時一個數據包()犯規被客戶端接收,但服務器在發送有和tcpdump顯示,包被髮送。如果服務器發送新的數據包,客戶端讀取先前的數據包,並且不接收新的數據包 - 它就像我不需要的隊列一樣工作。 P.S遺憾的英語不好-_-

回答

1

看起來像客戶端也許等待一些字節\n\u等知道幀結束後,你的緩衝區。我遇到類似的問題,因爲客戶端在傳輸結束時期待null byte

您可以嘗試添加以下排序encoder作爲您的管道中的最後一個編碼器,並試一試。處理nul字節的相關代碼如下所示。

ChannelBuffer nulBuffer = ChannelBuffers.wrappedBuffer(new byte[] { 0 }); 
    ChannelBuffer buffer = ChannelBuffers.wrappedBuffer((ChannelBuffer)msg,nulBuffer); 
0

嘗試使用沖水()上的每個或全部三個

+0

tcpdump顯示數據包被正確發送。 Flush不會幫助我 – user1081056 2012-03-22 10:16:37

相關問題