1

我的 iOS 应用程序需要套接字通信。我正在关注这个Ray Wenderlich 教程来设置输入和输出流。我使用的服务器是 Twisted。我的应用程序需要发送和接收由外部事件(如陀螺仪数据)生成的快速数据突发。它以 JSON 字符串的形式发送/接收数据。所以在很大程度上,它非常像一个实时消息聊天应用程序,但发送和接收速度非常快并且是突发的。

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

myAppDelegateDViewControllerare<NSStreamDelegate>都实现:

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

实现了所有流事件案例。

所以基本上,我的整个设置运行良好,但前提是数据不快(或者就此而言,我似乎无法确定确切的问题)。

以下是我在测试时所做的一些观察(使用 Simulator-iPhone 和 iPhone-iPhone 设置):

A. 模拟器 - iPhone:

  1. 现在,在这个设置中,我能够以我希望它从模拟器发送到 iPhone 的方式快速发送数据,但不能从 iPhone 发送到模拟器。iPhone 可以很好地接收所有字符串并按要求操作。

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

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

B. 苹果手机 - 苹果手机:

  1. 任一 iPhone(其中任何一个发送,而不是同时发送)一次只能接收一个 JSON 字符串的数据,并且在快速发送数据时两者都不起作用。如果发送速度很快,那么任何一部 iPhone 接收到的所有字符串都是一半(只接收到一半)。注意:服务器接收和发送完整的字符串,所有字符串即使速度很快,服务器也没有问题。

  2. 如果我同时从两部 iPhone 相互发送数据,即使速度很快,也能很好地接收和处理所有字符串。

这些观察让我相信,只有当 iPhone 同时向服务器发送某些内容时,它才会接收所有快速字符串。或者我可能完全错了,因为当模拟器发送到 iPhone 时,iPhone 无论如何都能接收到所有内容。我想知道模拟器的不同之处在于从它接收的字符串被 iPhone 完整接收,而不是相反。是不是 iPhone 发送的速度比模拟器快,因此它发送的所有字符串都没有被接收方注册?请有人帮我破解这个!

注意:在所有情况下,服务器都能完美运行,无论速度如何,它都可以全长发送和接收数据。我正在使用 iOS 7。

更新1: 好的,所以整天都在试验它,我终于让它工作了。问题是,这正是我的问题陈述,如果你想连续快速地从输入流接收,输出流不能保持空闲。我不知道为什么会发生这种情况,如果有人可以启发我。所以我正在使用的快速修复是,每当我在输入流上获得字节时,我立即将空白数据发送到服务器以保持输出流处于活动状态。所以现在输入流可以快速读取完整的数据。但我觉得这是对服务器资源的浪费。另外,这不是一个可靠的解决方案。我正在寻找一个具体的解决方案。我想知道模拟器是如何做到的,而不用担心输出流的使用。有人可以帮忙吗?

更新 2: 从以前的更新中学习,这不是向服务器发送空白数据,但如果我想从他那里接收完整的下一个字符串,我需要向发送者发送虚拟数据。如果我想快速和完整地结束/接收数据,我需要使用虚拟/空白数据保持端到端通信。有人遇到过这个问题并找到了更好的可靠/具体的方法吗?

4

0 回答 0