2012-02-20 61 views
0

我正在執行4個啓動命令並且還期望收到4個響應。服務器已經實現,另一個開發android的開發人員能夠接收這4個單獨的響應,但是,我得到了2個很好的響應(單獨),然後第3個和第4個響應作爲一個響應來發送。我把NSData的NSLog結果放在completeCurrentRead中,它輸出合併的數據包「0106000000000b0600000000」而不是單獨的數據包「010600000000」和「0b0600000000」。我還分別測試了這些第三和第四個命令(一次只有一個),並且服務器一切正常,它們分別發送它們,但是如果所有四個命令都在一行中執行,則會發生合併(第3和第4個) 。有任何想法嗎?AsyncSocket:合併兩個數據包而不是單獨的兩個數據包

更新:我認爲我追溯到問題的根源。還有,從在doBytesAvailable方法的流中讀取數據包數據呼叫:

CFIndex result = [self readIntoBuffer:subBuffer maxLength:bytesToRead]; 

而且在readIntoBuffer:最大長度,有一個叫(長度== 256):

return CFReadStreamRead(theReadStream, (UInt8 *)buffer, length); 

所以,CFReadStreamRead返回不正確的長度的數據包 - 它返回12(而不是6)的長度,並且還獲取合併的數據。嗯,什麼可能會導致CFReadStreamRead讀取兩個數據包爲一個,而不是分開讀取它們...

UPDATE2:我使用onSocket:didReadData:withTag:委託方法,並期望接收具有請求標記的響應數據我表演過。我最近意識到,流是流,而不是數據包,但我怎麼能解決這個問題?服務器響應在響應的開始和結束處沒有終止字符,只是響應大小,即2到5個字節。我可以削減響應的第一部分(第一個數據包)並忽略第二部分,但AsyncSocket如何使用響應的第二部分(第二個數據包)進行另一個回調?如果我只會削減第一部分,忽略第二,然後恕我直言,第二個「數據包」將丟失...

如何削減響應的第一部分,並告訴AsyncSocket使用標記和第二部分進行另一個回調作爲單獨回調的迴應?

UPDATE3:在onSocket:didReadData:withTag :,我手工切割合併響應,處理所述第一部分(第一分組),然後在結束時,投擲到onSocket呼叫:didReadData:withTag:再次:

if (isMergedPacket) { 
    ... 
[self onSocket:sock didReadData:restPartOfTheResponse withTag:myCommandTag]; 
} 

但是,它看起來像AsyncSocket本身使用標記將每個請求數據包與其響應數據包(通過AsyncReadPacket類)配對。所以,我的手動切割工作,但AsyncSocket不知道我已經處理了這兩個數據包,並仍嘗試讀取第二個數據包。所以,我得到了襪子:shouldTimeoutReadWithTag:...回調,當讀取操作達到其超時沒有完成時調用。

回答

0

找到解決辦法。沒有必要更改並挖掘AsyncSocket。你只需要定義每個響應的長度 - 你有多少字節在閱讀和獲取回調。更多信息您可以在其他職位here