对于我正在开发的iOS应用程序,我希望多部手机能够相互连接,并能够在这些设备之间进行语音聊天。
当两个设备都在同一个网络上时,我会让它工作。这很简单,我想做的大部分事情都是可能的。
但现在我增加了互联网支持,这是相当麻烦的。首先,我将尝试解释如何使用我设置的一个小型set服务来匹配这些设备。
服务器
WebService
客户端
当然,这不起作用,因为我的网络不允许传入连接和随机端口(来自外部网络)。
但现在的问题是,我该如何解决这个问题?我希望能够在两个设备之间建立一个对等连接,这些设备可以在同一个网络上,但也可以在不同的网络上。
是否有一个框架、示例或任何东西来说明如何做到这一点?我希望能够将数据从一个设备发送到另一个设备,而不首先将数据发送到服务器。
发布于 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。
https://stackoverflow.com/questions/14005162
复制相似问题