GCDAsyncSocket readDataWithTimeout和didReadData截断大于1460字节的输入数据字符串(1个数据包)

时间:2012-05-03 21:43:24

标签: ios gcdasyncsocket

我的iOS应用使用GCDAsyncSocket从服务器接收数据。服务器每分钟收集一次外部数据。该应用程序定期连接到服务器,并接收此数据。服务器会跟踪已发送的内容,因此每分钟的数据只会发送一次。服务器只保留最后一小时的数据。每分钟的数据都是一个大约100个字节(+/- 20个字节)的字符串。

收到字符串,分成几分钟,每分钟分成每分钟数据中的各种数量。

如果应用程序未连接服务器超过一小时,该应用程序将下载60分钟的数据。发生这种情况时,我只得到大约15分钟的数据。我跟踪了这​​个事实,即readDataWithTimeout方法只在readQueue上加载一个数据包,这限制了我1460个字节。我发现当我向队列添加第二个数据包时,我得到另外1460个字节的数据。如果字符串是它们的最大长度,并且我正在下载60个字符串,那么5个数据包将足以捕获所有内容。

  1. 如果我向读取队列添加的数据包多于必要的数据包,并且大多数读取仅使用一个数据包,那么我最终是否会溢出数据包队列?我可以应用某种超时来清除未使用的数据包吗?应用程序无法预测任何给定读取事件可能需要数据包。
  2. 另一个问题是数据包数据字符串的最后一分钟将不可避免地分成两个数据包。我想要做的是收集所有数据包的NSData实例,将它们连接成一个大型NSData实例,将其转换为字符串,并正常解析该字符串。

    1. 我如何知道何时收到了针对给定读取请求将要接收的最后一个数据包,以便我可以组合NSDatas并解析生成的字符串? 每分钟的字符串以感叹号'!'结尾,但没有唯一的符号表示传输的结束。我假设解决问题1的相同超时将解决问题2.
    2. 此应用已针对Android发布。因此,如果可能的话,我想避免更改服务器和Android代码以适应iOS版本。

1 个答案:

答案 0 :(得分:1)

每次我请求读取时,我最终只向readQueue添加了5个数据包,并为读取添加了一个超时,以便队列不会溢出。我还设置了一个NSTimer,在didReadData回调结束后2秒后触发。当计时器过去时,假设已读取所有可用数据,并处理字符串。每个计时器都使用相同的NSTimer实例,因此如果计时器处于活动状态,并且发生了另一个didReadData事件,则会启动一个新计时器,从而消除旧计时器。