GameKit / Peer-to-peer over Internet

时间:2012-12-22 17:55:57

标签: objective-c ios p2p gamekit

对于我正在开发的iOS应用,我希望多个手机相互连接,并能够在这些设备之间进行语音聊天。

当两台设备都在同一网络上时,我就可以使用它。这很简单,我想做的大部分事情都是可能的。

但现在我正在增加互联网支持,这是一件非常麻烦的事情。我将首先尝试使用我设置的小型Web服务来解释我希望如何匹配设备。

服务器

  1. 使用会话模式GKSessionModePeer
  2. 开始新的GameKit会话
  3. 在我刚创建的会话中找到服务器的“对等ID”
  4. 在空闲端口上创建一个新的CFSocketRef并准备接受连接
  5. 将对等ID和端口号发送到我的Web服务,在外部服务器上运行。
  6. 的WebService

    1. Webservice接收信息并将其与ID和客户端的IP地址一起存储在数据库中。
    2. 将ID发送回服务器,显示ID
    3. 客户端

      1. 当用户选择使用GameKit的“在线”功能搜索游戏时,我会询问用户一个ID(用户应该输入服务器收到的ID)。
      2. 客户端连接到提供ID的Web服务。 webservice返回有关服务器会话的信息(IP,PORT,Peer ID)。
      3. 用户尝试使用端口信息连接到IP地址,并在服务器上设置输入和输出流。
      4. 这不起作用,因为我的网络不允许传入连接和随机端口(来自外部网络)。

        但现在的问题是,我该如何解决这个问题?我希望能够在2个设备之间建立点对点连接,这些设备可以位于同一网络上,也可以位于不同的网络上。

        是否有框架,示例或任何显示如何执行此操作的内容?我希望能够将数据从设备发送到设备,而不是先将其发送到服务器。

1 个答案:

答案 0 :(得分:6)

我不知道有任何框架可以做到这一点。但是,我在多个网络上有很多p2p网络的经验。

我学到的一条重要规则:在网络之间进行通信时,除非必要,否则不要创建直接连接。有太多因素可以(会?)导致问题,例如防火墙,NAT等等。

当然,您可以先尝试连接。您可以尝试连接到给定的IP地址*,但在大多数情况下它会失败。即使使用UPnP和NAT-PMP,您会发现在很多情况下(超过一半?)您将无法接受传入连接。

因此请务必制定备用计划。创建一个不仅listen(),而且还连接到服务器的网络层抽象。这样,当您无法连接到客户端的IP *时,您只需通过服务器建立连接,网络抽象就可以完成所有工作。

让我重申以上内容:不要只依赖传入连接,总是有备份计划。


*我写IP,因为客户端可以有多个本地/远程IP。连接时始终迭代所有这些IP。示例:我的手机有2个本地IPv4地址(10.0.0.172和10.8.0.2)和一个IPv6地址([2001:x:x :: 6])。在这三个地址中,只有IPv6地址是可公开访问的,并且这两个IPv4地址位于不同的子网上,因此您是否可以连接到它们取决于另一个客户端所在的子网。始终尝试连接到两者,并在失败时回退到服务器代理的连接。

**我提到了IPv6,是的。我们不要忘记,与IPv4不同,IPv6不受NAT的限制,这意味着如果支持,您通过IPv6获得良好连接的可能性要大于IPv4。