我正在构建一个使用与 Web 服务器的异步套接字连接的应用程序。为了发送大量数据,我想使用异步套接字将两部 iPhone 连接到对等连接中。我对 GCDAsyncSocket 比对 iOS SDK 套接字 API 更熟悉。
我做过类似的事情,但只有在本地网络中,我才会使用 NSNetService 发布存在并从 p2p 连接获取所需的地址。
你能给我一个关于如何使用 p2p 套接字连接通过互联网连接两个 iPhone 的提示吗?
我正在构建一个使用与 Web 服务器的异步套接字连接的应用程序。为了发送大量数据,我想使用异步套接字将两部 iPhone 连接到对等连接中。我对 GCDAsyncSocket 比对 iOS SDK 套接字 API 更熟悉。
我做过类似的事情,但只有在本地网络中,我才会使用 NSNetService 发布存在并从 p2p 连接获取所需的地址。
你能给我一个关于如何使用 p2p 套接字连接通过互联网连接两个 iPhone 的提示吗?
我对 NSNetService 不太了解,但它似乎只适用于本地网络。如果您想建立从 iphone 到另一个 iphone 的 p2p 连接,您的路由中总会遇到多个 NAT(网络地址转换器)的问题。如何找到对等点的地址和路由?以及如何通过所有的防火墙和 NAT?
我正在开发一个需要处理相同问题的应用程序,并且我已经回答了一个类似的问题,在此之前我将在这里引用:
实际上,这是可能的。您可能想在谷歌上搜索称为“UDP 打孔”或“TCP 打孔”的东西。
简而言之,主要方法是:假设您有类似中继服务器的东西,它是互联网中的某个服务器,可以从连接到 www 的每个私有 LAN 公开寻址。不,您的两个客户端 A 和 B 在(不同的)私有 LAN 中,并且正在进行一些网络地址转换(NAT),它们想要建立对等连接。
首先,两者都会告诉服务器他们的 IP 地址和他们在自己的 LAN 中的端口。在 UDP 或 TCP 数据包中,服务器会找到设备(或 NAT(路由器))的公共地址和端口。因此服务器知道私有和公共 IP 地址以及端口。
如果现在 A 想与 B 通信,它会向服务器寻求帮助。服务器将向 B 发送一条消息,表明 A 想与她通信,告诉她 A 的公共和私有 IP 和端口。A 取回 B 的公私信息和端口。
现在这里是魔法发生的地方。两个客户端现在都发送数据包以同时建立与另一方的私有和公共地址的连接,从而在他们的 NAT 中打入一个整体,这样传入的连接就不会被阻塞。即使一方的连接建立数据包会在整个创建之前到达,另一方的数据包也会通过,以便可以创建连接。
当心一些 NAT 扫描 IP 地址数据并对其进行转换,但如果您加密数据或更改地址的外观(补码,...),您会没事的。
现在的主要问题是,服务器如何在没有活动连接的情况下与其中一个客户端通信。那么在这种情况下,您可以使用“连接反转”和苹果的“推送通知”。使用“推送通知”(pn) 告诉 NAT 后面的客户端有一些有趣的事情正在发生,它应该联系服务器。一旦完成,连接就处于活动状态并且可以按照前面描述的方式使用。
我希望这可以帮助一些解决这个问题的人,尽管这篇文章已经很老了!
现在,如果您发现此解决方案有帮助并尝试实施它,请告诉我您是否成功获取服务器端服务器-客户端连接的公共 ip 和端口。你也可以在 stackoverflow 上回答我的问题。
请具体说明,你可以使用 GCDAsyncSocket 连接两部手机,你可以使用 Github 的示例代码。