Objective c GameKit/互联网上的点对点
对于我正在开发的iOS应用程序,我希望多部手机能够相互连接,并能够在这些设备之间进行语音聊天 当两台设备都在同一个网络上时,我可以让它工作。这很简单,我想做的大部分事情都是可能的 但现在我添加了互联网支持,这是一个相当麻烦的问题。我将首先尝试使用我设置的一个小Web服务来解释如何匹配这些设备 服务器Objective c GameKit/互联网上的点对点,objective-c,ios,p2p,gamekit,Objective C,Ios,P2p,Gamekit,对于我正在开发的iOS应用程序,我希望多部手机能够相互连接,并能够在这些设备之间进行语音聊天 当两台设备都在同一个网络上时,我可以让它工作。这很简单,我想做的大部分事情都是可能的 但现在我添加了互联网支持,这是一个相当麻烦的问题。我将首先尝试使用我设置的一个小Web服务来解释如何匹配这些设备 服务器 使用会话模式GKSessionModelPeer启动新的GameKit会话 在我刚刚创建的会话上查找服务器的“对等ID” 在空闲端口上创建新的CFSocketRef,并使其准备好接受连接 将对等ID
是否有一个框架、示例或任何说明如何做到这一点的内容?我希望能够将数据从一个设备发送到另一个设备,而无需先将数据发送到服务器。我不知道有任何框架可以做到这一点。不过,我在跨多个网络的p2p网络方面有很多经验 我学到的一条重要规则是:在网络间通信时,除非必要,否则不要创建直接连接。有太多的因素会导致问题,比如防火墙、NAT等等 当然,您可以让连接先尝试。您可以尝试连接到给定的IP地址*,但在大多数情况下会失败。即使使用UPnP和NAT-PMP,您也会发现在很多情况下(超过一半?),您根本无法接受传入连接 所以一定要有备份计划。制作一个网络层抽象,不仅
listen()
,而且还连接到服务器。这样,当您无法连接到客户端的IPs*时,您只需通过服务器建立一个连接,网络抽象就可以完成这一切
让我重申以上几点:不要只依赖传入的连接,始终要有一个备份计划
*我写IP是因为客户端可以有多个本地/远程IP。连接时始终迭代所有这些IP。示例:我的手机有两个本地IPv4地址(10.0.0.172和10.8.0.2)和一个IPv6地址([2001:x:x::6])。在这三个地址中,只有IPv6地址是可公开访问的,而这两个IPv4地址位于不同的子网上,因此您是否可以连接到它们取决于另一个客户端所在的子网。始终尝试连接到这两个服务器,并在服务器代理连接失败时返回到服务器代理连接
**我提到IPv6,是的。别忘了IPv6不受NAT的限制,这与IPv4不同,这意味着如果支持IPv6,您通过IPv6获得良好连接的可能性远远高于IPv4。这正是我所担心的。Gamecenter似乎确实支持语音聊天,但由于P2P连接存在的问题,我猜他们使用的是某种SIP。