我们开发了一个客户端应用程序和一个服务器应用程序。客户端使用http协议(protocol)与服务器通信,并发送一些数据供服务器处理。
我们的结构允许我们将服务器安装在任何地方。我可以在同一个客户端网络上,甚至在云上。
当服务器托管在云上时,向用户询问服务器地址是有意义的(因为如果用户愿意,它可以更改),但当服务器与客户端位于同一网络上时则没有意义。除此之外,我们目前要求用户配置服务器 ip/name 以连接到服务器。
为了避免这种情况(向用户询问地址),我开发了一个基于 UDP 的发现服务。客户端广播一条消息,服务器用它的地址来回答。它在某些情况下确实有效,但当用户有某种防火墙、代理甚至防病毒时,它就不起作用了。
我已经阅读了很多关于发现服务的内容,其中最喜欢的是 Bonjour .
所以,问题是:当服务器与客户端位于同一网络上而不会被防火墙、代理等阻止时,发现服务器 IP 的最佳方法是什么?
最佳答案
您可以通过实现 hole punching 将您的服务完全保持在本地(在 Intranet 中)并构建在您现在使用的服务之上。 .您可以通过防火墙,但我真的不确定 AV 软件策略。
或者您可以在 Internet 上建立一个著名的基于 http 的发现服务。
这当然会在您的系统中产生单点故障,因为如果发现服务踢了桶,您的客户端将无法找到服务器。您可以通过复制服务和/或引入后备机制(例如您拥有的纯本地发现)来解决此问题,无论如何您都可能想要这样做。您可能遇到的唯一问题是子网标识,如果本地子网中的计算机不共享外部 IP 地址(那么这取决于您的本地子网是什么)。
关于language-agnostic - 如何自动检测服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10901250/