2012-05-03 12 views
1

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

将字符串接收,分为几分钟,每分钟将数据分成不同的数量。

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

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

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

  1. 我怎么知道什么时候收到了一个给定读请求的最后一个数据包,这样我就可以组合NSDatas并分析结果字符串了? 每分钟的字符串以感叹号'!'结尾,但没有用于表示传输结束的唯一符号。我假设解决问题1相同的超时将解决问题2.

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

+0

你使用什么IP协议?如果它是TCP,你使用的TCP协议是什么?我不明白当服务器发送60分钟时仅获得15分钟的数据。当服务器发送所有数据时,它是否断开客户端连接? –

+0

没关系 - 如果你使用的是GCDAsyncSocket,它是TCP。 1460看起来像以太网MTU大小一样可疑。刚刚发生了一个可怕的想法 - 你是否假设TCP传输大于一个字节的消息? –

+0

我使用TCP发送数据串。我在PC应用程序上使用NI的Labwindows来创建TCP服务器。当服务器连接时,它创建字符串并使用Labwindows库函数ServerTCPWrite()发送它。在PC端从我这里抽象出分组化。但是当我在应用程序端进行阅读时,GDCAS正在给我一个数据包。那是因为GDCAS只在每个写请求的readQueue上放置一个数据包。 – ToddMuir

回答

1

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

+0

你使用过readDataToData还是readDataWithTimeout? – user523234

+0

我用readDataWithTimeout – ToddMuir

相关问题