gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:40:07 25 4
gpt4 key购买 nike

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

while (“响应包”未被读取) do {

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

这是我目前对 AsyncSocket 的用法:

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

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

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

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

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

最佳答案

找到解决方案。您需要在 AsyncSocket 委托(delegate)方法中调用 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:。

关于objective-c - AsyncSocket:如何定义读取长度并仅在达到读取长度时获得回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9410754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com