【问题标题】:GameKit/Peer-to-peer over internetGameKit/点对点网络
【发布时间】:2012-12-22 17:55:56
【问题描述】:

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

当两台设备都在同一个网络上时,我可以正常工作。这很简单,我想做的大部分事情都是可能的。

但现在我正在添加互联网支持,这很麻烦。我将首先尝试使用我设置的小型 Web 服务来解释我想如何匹配设备。

服务器

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

网络服务

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

客户

  1. 当用户选择使用 GameKit 的“在线”功能搜索游戏时,我要求用户输入 ID(用户应输入服务器接收到的 ID)。
  2. 客户端连接到提供 ID 的 Web 服务。网络服务返回有关服务器会话的信息(IP、PORT、Peer ID)。
  3. 用户尝试使用端口信息连接到 IP 地址,并与服务器建立输入和输出流。

这当然行不通,因为我的网络不允许传入连接和随机端口(来自外部网络)。

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

是否有框架、示例或任何内容显示如何做到这一点?我希望能够将数据从设备发送到设备,而无需先将其发送到服务器。

【问题讨论】:

    标签: objective-c ios p2p gamekit


    【解决方案1】:

    我不知道有任何框架可以做到这一点。不过,我确实在跨多个网络的 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 高得多。

    【讨论】:

    • 这正是我所害怕的。似乎 Gamecenter 确实支持语音聊天,但由于我在 P2P 连接上看到的问题,我猜他们使用某种 SIP。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-28
    • 1970-01-01
    • 2022-11-23
    • 1970-01-01
    • 2010-12-28
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多