首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网络上的GameKit/

网络上的GameKit/
EN

Stack Overflow用户
提问于 2012-12-22 17:55:56
回答 1查看 1.4K关注 0票数 3

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

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

但现在我增加了互联网支持,这是相当麻烦的。首先,我将尝试解释如何使用我设置的一个小型set服务来匹配这些设备。

服务器

  1. 使用会话模式GameKit启动一个新的GKSessionModePeer会话
  2. 在我刚刚创建的会话中找到服务器的“对等ID”
  3. 在空闲端口上创建一个新的CFSocketRef,并使其随时准备接受连接
  4. 向运行在外部服务器上的webservice发送对等ID和端口号。

WebService

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

客户端

  1. 当用户选择使用GameKit的"Online“功能搜索游戏时,我向用户询问ID (用户应该输入服务器接收的ID )。
  2. 客户端连接到提供ID的Peer服务。Peer服务返回有关服务器会话(IP、端口、对等ID)的信息。
  3. 用户尝试用端口信息连接到IP地址,并使用服务器设置输入和输出流。

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

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

是否有一个框架、示例或任何东西来说明如何做到这一点?我希望能够将数据从一个设备发送到另一个设备,而不首先将数据发送到服务器。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-12-22 18:50:24

我不知道有什么框架能做到这一点。不过,我在跨多个网络的p2p网络方面确实有很多经验。

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

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

所以一定要有备用计划。使网络层抽象,不仅是listen(),而且连接到服务器。这样,当您无法连接到客户端的IP*时,您只需通过服务器建立一个连接,网络抽象就可以处理这一切。

让我重申以上几点:不要只依赖传入的连接,始终要有备份计划。

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14005162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档