AsyncSocket:合并两个数据包而不是分开的两个数据包

我正在执行4个启动命令,也期待收到4个响应。 服务器已经实现,另一个正在开发android的开发者能够接收这4个单独的响应,但是,我得到了2个很好的响应(单独的),然后第三个和第四个响应作为一个响应。 我把NSData的NSLog结果放在completeCurrentRead中,输出合并的数据包“0106000000000b0600000000”而不是单独的数据包“010600000000”和“0b0600000000”。 我还分别testing了这些第三和第四个命令(一次只能有一个),一切正常,然后分别发送,但是如果所有四个命令在一行中执行,就会发生合并(第三和第四) 。 有任何想法吗?

更新:我想我已经追溯到问题的根源。 有一个调用从doBytesAvailable方法的stream中读取数据包数据:

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

在readIntoBuffer:maxLength中,有一个调用(长度= 256):

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

因此,CFReadStreamRead返回不正确的数据包长度 – 它返回12(而不是6)的长度,也抓取合并的数据。 嗯,什么可能会导致CFReadStreamRead阅读两个数据包成一个,而不是分开阅读它们…

UPDATE2:我正在使用onSocket:didReadData:withTag:委托方法,并希望接收响应数据与我执行的请求的标记。 我最近意识到,stream是stream,而不是数据包,但是我怎么能解决这个问题呢? 服务器响应在响应的开始和结束处没有终止字符,只是响应大小,即2到5个字节。 我可以减less响应的第一部分(第一个数据包),忽略第二部分,但AsyncSocket如何使用响应的第二部分(第二个数据包)进行另一个callback? 如果我只会削减第一部分,忽略第二,然后恕我直言,第二个“包”将丢失…

如何减less响应的第一部分,并告诉AsyncSocket使用标记和响应的第二部分作为单独的callback进行另一个callback?

UPDATE3:在onSocket:didReadData:withTag :,我手动剪切合并的响应,处理第一部分(第一个数据包),然后在最后,对onSocket:didReadData:withTag:再次调用:

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

然而,它看起来像AsyncSocket本身使用标签将每个请求包与其响应包(通过AsyncReadPacket类)配对。 所以,我的手动切割工作,但AsyncSocket不知道我已经处理了两个数据包,它仍然试图读取第二个数据包。 所以,我得到的袜子:shouldTimeoutReadWithTag:…callback,当一个读取操作达到超时没有完成时调用。

find解决scheme 没有必要改变并挖掘到AsyncSocket。 您只需要定义每个响应的长度 – 您有多less字节在阅读和获取callback。 更多信息,你可以在这里的其他职位