AsyncSocket:如何定义读取长度并仅在达到读取长度时获取回调

时间:2012-02-23 09:59:39

标签: objective-c ios sockets asyncsocket

是否可以使用AsyncSocket执行以下操作:

while(“未读取响应数据包”)执行{

  1. 从读取流中读取至少前5个字节,并从中提取“响应包”长度大小。
  2. 进一步阅读,直到达到“响应数据包”标题中定义的读取字节数。
  3. 如果到达读取流的末尾但缺少一些字节,则等待另一个读取流并完成读取“响应包”。
  4. 将读取的字节复制到缓冲区中,并将读取数据标记为“响应数据包”数据。
  5. 回调我的委托onSocket:didReadData:withTag:with the data。
  6. 清除缓冲区(响应数据包)并对下一个读取流执行相同的步骤。
  7. }

    这是我目前使用的AsyncSocket:

    我正在通过套接字使用AsyncSocket编写数据:

    [_socket writeData:request withTimeout:commandData tag:commandTag];
    

    并在我的委托类中接收回调:

    onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag
    

    问题是,数据流中没有终止字符,并且区分“响应数据包”的长度的唯一方法是读取并解析它们的前5个字节,并使用它来将数据切割成“数据包”并进行回调我的代表目前,我正在使用AsyncSocket,如上面的代码片段所示,并且一些回调“onSocket:didReadData:withTag:”已经是良好的长度数据包(收到NSData),但有些是合并的。恕我直言,我需要明确告诉AsyncSocket在阅读时如何解释并将未来数据切割成数据包。

1 个答案:

答案 0 :(得分:1)

找到解决方案。你需要在AsyncSocket委托方法中调用onSocket:didWriteDataWithTag:

- (void)onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag {

   ...
  [sock readDataToLength:<preferred size of response packet> withTimeout:myTimeout tag:tag];

  //instead of
  //[sock readDataWithTimeout:myTimeout tag:tag];
}

这样你就可以定义何时调用onSocket:didReadData:withTag:。