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

标签 objective-c ios sockets asyncsocket

是否可以使用 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/

相关文章:

c# - Objective-C 中的字符串加密在 C# 中解密

ios - 如何正确设置 4s 的自动布局约束?

java - 从面向连接(TCP)客户端/服务器的服务器套接字读取客户端套接字上的字节数据包?

objective-c - 呈现 Modal ViewController 会导致 SIGABRT

iphone - 如何知道从按钮 ios 输入数据时文本字段值是否发生变化

ios - 为整个 NSString 生成 NSRange 的快捷方式?

ios - 播放音乐问题

ios - Firebase 错误代码 9999 "blocked"

c - 运行服务器进程时动态获取C中未使用的端口号

java - Android FileOutputStream 似乎失败