只有输出stream同时发送,iOSinputstream才能接收快速数据

我的iOS应用需要套接字通信。 我正在关注这个 Ray Wenderlich教程来设置input和输出stream。 我正在使用的服务器是Twisted。 我的应用程序需要发送和接收由陀螺仪数据等外部事件产生的快速爆发数据。 它是以JSONstring的forms发送/接收数据。 很大程度上,这就像一个实时消息聊天应用程序,但发送和接收速度非常快,爆发。

所以我的应用程序布局是,我有1视图控制器: DViewContorller和一个tabbarcontroller与3个tableviewcontrollers。 我需要在所有这4个视图控制器中发送和接收数据,因此我在App Delegate中实现了套接字stream初始化。 对于所有3个选项卡,我的App Delegate设置[self.inputstream setDelegate:self]但是当它在DViewController它将inputstream的委托设置为DViewController的引用。 在DViewController (void)viewWillDisappear中,我将inputstream委托重置为AppDelegate的引用,以使其重新获得对inputstream的控制权。 对于outputstream,委托始终设置为AppDelegate并且永远不会更改。

我的AppDelegateDViewController都是<NSStreamDelegate> ,它们都实现了:

 - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent} { } 

所有的stream事件实施。

所以基本上,我的整个设置运行良好,但只有数据不是很快(或者说,我似乎无法查明确切的问题)。

所以这里有一些我在testing时所做的观察(使用Simulator-iPhone和iPhone-iPhone设置):

A.模拟器 – iPHONE:

  1. 现在在这个设置中,我能够快速,准确地发送数据,从Simulator发送到iPhone,而不是从iPhone发送到Simulator。 iPhone收到所有的string,并按照要求行事。

  2. 从iPhone发送到模拟器,模拟器一次只能读取一个JSONstring的数据,并且在数据发送快时不起作用。 如果发送速度快,则模拟器接收到的所有string都是一半(仅接收到一半)。 注意:服务器接收和发送完整的string,即使速度很快,所有的string也没有问题。

  3. 如果我同时发送数据,同时从模拟器和iPhone发送数据,即使速度很快,也能很好地接收和处理所有的string。

B. iPHONE – iPHONE:

  1. 任何一个iPhone(任何一个发送,不能同时发送)一次只能接收一个JSONstring的数据,并且在数据快速发送时都不工作。 如果发送速度很快,那么任何iPhone收到的所有string都是一半(仅接收到一半)。 注意:服务器接收和发送完整的string,即使速度很快,所有的string也没有问题。

  2. 如果我同时发送数据,同时从两个iPhones到彼此,即使快速,都收到和处理好所有的string。

这些观察使我相信,只有当iPhone正在同时向服务器发送某些东西时,iPhone才能接收到所有快速string。 或者我可能是完全错误的,因为当模拟器发送到iPhone时,iPhone无论如何都能接收到一切。 我想知道模拟器做了什么不同,从iPhone收到的string是由iPhone完全采取,而不是相反。 iPhone的发送方式是否比模拟器的发送速度快,因此所有发送的string都不会被接收器注册? 有人帮我破解这个请!

注意:在任何情况下,服务器都能正常工作,无论速度如何,它都可以全速发送和接收数据。 我正在使用iOS 7。

更新1:好吧,一整天都在试验,我终于做到了。 事情是,正是我的问题是,输出stream不能停留在空闲,如果你想从inputstream连续快速接收。 我不知道为什么会发生,如果有人可以启发我。 所以我使用的快速修复是每当我得到inputstream的字节,我立即发送空白数据到服务器,以保持输出stream活跃。 所以现在inputstream可以快速读取完整的数据。 但是我觉得这是一个服务器资源的浪费。 另外这不是一个可靠的解决scheme。 我正在寻找一个具体的解决scheme。 我想知道模拟器是如何工作的,而不用担心输出stream的使用。 任何人都可以帮忙吗?

更新2:从以前的更新学习,这不是关于发送空白数据到服务器,但我需要发送虚拟数据发件人,如果我想从他完成接收下一个string。 如果我想要快速完成数据结束/接收,我需要保持端到端的通信与虚拟/空白数据。 任何人都有这个问题,并find一个更好的可靠/具体的方式来做到这一点?