2011-05-25 52 views
1

我發送的消息可能大於默認的套接字緩衝區大小。因此可能會有幾個讀取操作來接收完整的消息。當結束條件是使用java nio的部分消息問題

n = socket.read(rbuf); 
if(n==0) || (n==-1) 
    break; 

部分消息的例外仍然存在。有什麼好辦法來解決這個問題。謝謝

我使用多個進程在一臺機器上運行。每個進程使用一個nio套接字。這是否可能導致部分消息?

回答

3

0是一個有效的讀取返回值,它不表示通道結束。 -1表示通道的結束。所以如果你在返回0時結束閱讀,你會得到部分消息。

+0

我通過首先緩衝消息來完成解決問題。完整的條件是符合結束字符。 – susan 2011-06-01 14:17:15

1

我建議使用Netty,它建立在Java的NIO類的基礎之上,但給你一個(在我看來)比Java JDK NIO類更可用的API。

爲了解決您的問題,您可以使用ReplayingDecoder,Netty會一次又一次地調用您的流(ChannelBuffer)解碼器,直到您有足夠的數據來理解它。

+0

從Java JDK NIO類轉移到Netty有多困難?有沒有例子? – susan 2011-05-25 20:47:01

+0

這真的取決於你有多少NIO代碼。 Netty比Java的NIO(恕我直言)容易得多,所以使用它更快(我發現)。但是,顯然如果你有大量的Java NIO代碼,這在短期內可能是不切實際的。也許在Netty中實現一個新功能以及現有的代碼,看看它是否適合你。 – alpian 2011-05-25 22:39:36