1

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

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

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

  1. 如果我向读取队列中添加了比必要更多的数据包,并且大多数读取只使用一个数据包,我最终会溢出数据包队列吗?我可以应用某种超时来清除未使用的数据包吗?应用程序无法预测任何给定的读取事件需要多少数据包。

另一个问题是数据包的最后一分钟数据串将不可避免地分成两个数据包。我想做的是收集所有数据包的 NSData 实例,将它们连接成一个大的 NSData 实例,将其转换为字符串,然后正常解析该字符串。

  1. 我如何知道何时接收到给定读取请求的最后一个数据包,以便我可以组合 NSData 并解析结果字符串?每分钟的字符串都以感叹号“!”结尾,但没有唯一的符号来表示传输的结束。我假设解决问题 1 的相同超时将解决问题 2。

此应用程序已针对 Android 发布。因此,如果可能的话,我想避免更改服务器和 Android 代码以适应 iOS 版本。

4

1 回答 1

1

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

于 2012-05-04T19:14:05.890 回答