2012-07-12 186 views
1

現在我已經建立了與我的桌面服務器的Socket連接。一般來說它工作正常,我試圖找到任何剩餘的錯誤。我無法解決的一個問題是當我發送「發送」按鈕時。有時它會將意圖分開發送的消息合併成一條消息。我很確定這是一個Android問題,而不是我的服務器的問題。這裏是一個例子(從服務器輸出控制檯):Android套接字連接合併發送

XX.XX.XX.XX: {"control":[],"commands":[]} 
XX.XX.XX.XX: {"control":[],"commands":[]} 
XX.XX.XX.XX: {"control":[],"commands":[]} 
XX.XX.XX.XX: {"control":[],"commands":[]}{"control":[],"commands":[]} 

這導致我的JSON解析器無法正常工作。我有能力通過藍牙或無線連接到我的服務器,並且我注意到,只有在使用Wifi而不是BluetoothSocket時纔會合併消息的問題。並不是說我不認爲藍牙插槽可能會有足夠的差距來組合,但是這裏的流量很少。有什麼方法可以確保我的數據包在發送時不會被合併?我瀏覽過Socket選項,不知道要尋找什麼。下面是我如何發送一個例子,很基本的:

mmDataOut.write(buffer);

哪裏mmDataOut只是一個DataOutputStreambufferbyte[]

此外,我添加了asyncsocket標籤,因爲我的服務器正在使用它們,不知道這是否會影響任何東西。

回答

5

聽起來像你正在使用TCP。這是TCP的預期行爲,您需要升級解析器才能支持它。

您不能安全地假設來自讀取端的大量數據將只包含一個命令,另外您也不能假設您將在單次讀取中獲得完整的命令。

+0

我有一種感覺,這是由於TCP。我正在使用的解析器無法處理它,所以我可以在解析之前手動遍歷字符串以檢查重複的JSON消息。現在,我只會抓住錯誤而忽略解析。謝謝。 – 2012-07-12 23:46:04

+0

你真的應該重新裝配成完整的東西。如果性能不是特別關注的話,一次讀取一個字符直到找到終止條件很容易。 – 2012-07-12 23:50:20

+0

@Atlos:雖然解析器可能無法處理部分或組合消息(這很好),但仍然有責任將消息拆分爲解析器*可以處理的內容。如果因爲給解析器不可分析的輸入而隨機丟棄了消息,那麼您的通信將變得不可靠和片斷。 – 2012-07-12 23:50:54