我的iOS应用需要套接字通信。我正在关注this Ray Wenderlich教程设置输入和输出流。我使用的服务器是Twisted。我的应用程序需要发送和接收由外部事件(如陀螺仪数据)生成的快速数据突发。它以JSON字符串的形式发送/接收数据。在很大程度上,它非常像一个实时的消息聊天应用程序,但发送和接收非常快,并且突发。
所以我的应用布局是我有一个视图控制器:DViewContorller
和一个带有3个tableviewcontrollers的tabbarcontroller。我需要在所有这4个视图控制器中发送和接收数据,因此我在App Delegate中实现了套接字流初始化。对于所有3个选项卡,我的App Delegate设置[self.inputstream setDelegate:self]
但是当它位于DViewController
时,它将输入流的委托设置为DViewController
的引用。在(void)viewWillDisappear
的{{1}}中,我将输入流委托重置为AppDelegate的引用,以使其重新获得对输入流的控制。
对于outputstream,委托总是设置为AppDelegate并且永远不会更改。
我的DViewController
和AppDelegate
都是DViewController
并且都实现了:
<NSStreamDelegate>
实现了所有流事件案例。
基本上,我的整个设置运行良好,但只有数据不快(或者就此而言,我似乎无法确定确切的问题)。
以下是我在测试时所做的一些观察(使用Simulator-iPhone和iPhone-iPhone设置):
一个。模拟器 - iPHONE:
现在在这个设置中,我能够快速准确地发送数据,我希望它能够从模拟器发送到iPhone,但不能从iPhone发送到模拟器。 iPhone可以很好地接收所有字符串,并按照要求行事。
从iPhone发送到模拟器,模拟器一次只能读取一个JSON字符串数据,并且在快速发送数据时不起作用。如果快速发送,则模拟器接收的所有字符串都是一半(只接收一半)。注意:服务器接收并发送完整的字符串,即使它很快,所有字符串也都没有问题。
如果我同时从模拟器和iPhone同时发送数据,即使速度很快,也能很好地接收和处理所有字符串。
B中。 iPHONE - iPHONE:
任何一个iPhone(其中任何一个发送,而不是两者一起发送)一次只能接收一个JSON字符串数据,并且在快速发送数据时两者都不起作用。如果快速发送,则任何iPhone接收的所有字符串都是一半(仅接收一半)。注意:服务器接收并发送完整的字符串,即使它很快,所有字符串也都没有问题。
如果我同时从两个iPhone发送数据,即使速度很快,也能很好地接收和处理所有字符串。
这些观察结果让我相信iPhone只有在同时向服务器发送内容时才会收到所有快速字符串。或者我可能完全错了,因为当模拟器发送到iPhone时,iPhone无论如何都能够接收到所有内容。我想知道模拟器做了哪些不同的事情,从它收到的字符串被iPhone全部摄取,但不是相反。 iPhone的发送方式是否比模拟器快得多,因此所有发送的字符串都不会被接收方注册?有人帮我解决这个问题!
注意:在所有情况下,服务器都能正常工作,无论速度如何,它都会以全长发送和接收数据。我使用的是iOS 7.
更新1: 好吧,所以一整天都在试验它,我终于让它发挥作用了。问题是,正是我的问题陈述,如果你想从输入流连续快速地接收,输出流不能保持空闲。我不知道为什么会发生这种情况,如果有人能够启发我的话。所以我使用的快速修复是每当我在输入流上获取字节时,我立即向服务器发送空白数据以保持输出流处于活动状态。所以现在输入流可以快速读取完整数据。但我觉得这是服务器资源的浪费。此外,它不是一个可靠的解决方案。我正在寻找一个具体的解决方案。我想知道模拟器是如何做到的,而不必担心输出流的利用。有人可以帮忙吗?
更新2: 从先前的更新中学习,它不是关于向服务器发送空白数据,但是如果我想从他那里接收下一个完整的字符串,我需要将伪数据发送到发件人。如果我想快速完成结束/接收数据,我需要使用虚拟/空白数据保持端到端通信。任何人都有这个问题,并找到了一个更可靠/具体的方法来做到这一点?