我想在没有任何服务器实现的情况下通过套接字连接多个设备。我将只使用它来获取将注册的设备的 IP 地址。
4 回答
对等通信有两个主要问题:发现和可达性。
首先,您需要知道其他对等方的 IP 地址才能连接到它们。一旦你连接到对等点的网格,它们都可以互相更新网络状态,相互推荐更好的对等点,传递新加入和离开的对等点的通知等。但是你有设计和实施交易该信息的机制。更重要的是,您需要以某种方式快速启动事物,因为当一个新的对等点启动时,它只是在自己的网格中,并且没有信息可以提供给自己。
一种可能性是让少数著名的“超级同行”(您运行的)始终保持连接,并将他们的地址烘焙到应用程序中。或者您可以使用“介绍服务器”而不是对等服务器,提供大致相同的功能。或者您可以有一些外部交易地址的方式(最简单的是用户在网络论坛或 IRC 频道或亲自交易它们并手动输入它们),这可以在不同程度上实现自动化。还有一些捷径可以提供帮助——只要 LAN 上的一个对等点已经存在,Bonjour 就可以让其他对等点加入网格;GameCenter/GameKit 可用作自动化的外部交易网络;等等
一旦你解决了发现问题,你仍然有可达性问题。大多数 iOS 设备通常没有可公开访问的 IP 地址;相反,它们位于进行网络地址转换的路由器之后,无论它们是家庭 WiFi 路由器还是蜂窝运营商的 3G 网络。这意味着您需要某种方式来进行 NAT 打孔,以使两部 iPhone 相互通话。知道每个设备的公共地址和内部地址的人可以安排他们建立彼此的连接。您可以让普通同行执行此操作(尽管这会使启动问题变得更大)或让您的超级同行/介绍服务器/等。做。
如果您想自己构建所有这些,您可能想查看其他实现。BitTorrent(包括跟踪器和 DHT)在从好奇的最终用户的“对孩子撒谎”到详细的协议规范和开源实现的各个级别都得到了很好的理解和记录。然后看看其他一些 P2P 网络,因为 BitTorrent 并不完美,并且不会尝试做每个人都想出的所有事情。
我一直在做类似的事情,这是一个巨大的痛苦。有 3 个考虑因素:1)可达性 2)发现 3)连接本身。
1) 甚至不要考虑使用 3g/4g,它只是不能很好地保持打开的套接字连接。
2)我会在互联网上的两者之间使用某种代理服务来连接两者。对于发现,您可以只列出服务上可用的设备。
3) 对于连接,我发现 IOS 套接字库使用起来相当痛苦,但如果你深入到 BSD 套接字级别,它并没有那么糟糕。我认为使用 zmq 套接字会很有趣;这可能会简化代理服务的编写。
你不能。如果设备全部通过 wifi 在线,则可能并依赖路由器设置,就像 pc 连接一样。如果某些设备通过 3g 或 gprs 协议连接,它们可能根本没有 IP 地址。