我试图与局域网上的每个人联系,以了解哪些设备目前正在使用ip并运行我的服务。运行该服务的每个设备都将知道其他哪些设备在联机时连接。我有基本的网络经验(tcp/udp),但对于更复杂的通信包,我没有做太多工作。我想张贴我已经研究/尝试到目前为止,并获得一些专家的答复,以限制我的尝试和错误的时间,在未来的潜在解决方案。
需求:
研究与尝试:
考虑到我的要求,这些建议中是否有一条看起来比其他建议更有效?你有没有其他更好的技术建议?
谢谢。
发布于 2013-01-12 20:39:59
您所指定的基本上是两个独立的问题:发现/监视和服务提供者。由于这两个问题在某种程度上是正交的,我将使用两种不同的方法来实现。
发现/监测
让每个设备在预定义端口上通过UDP在LAN上连续广播(小)心跳/状态消息。这个心跳应该包含设备的ip/端口(发送方),以及其他有趣的数据,例如该设备提供的服务的地址(URL)。如果需要降低带宽利用率,请选择紧凑的消息格式,例如协议缓冲区(以多种语言提供)或JSON以提高可读性。这些信息应定期发布,例如每5秒发布一次。
现在,让每个设备监听广播地址上的传入消息,并保存内存中的地图发送者,最后记录的时间+所有已知设备的其他数据。迭代地图,每秒钟说一次,并删除发送者谁已经沉默了x心跳间隔(例如3x5秒)。这样,每个节点将知道所有其他响应节点。
您不必知道任何IP:s,不需要任何额外的目录服务器,也不需要迭代所有可能的IP地址。此外,通过UDP发送/接收数据比通过TCP简单得多,而且不需要任何连接。它还产生较少的开销,这意味着更少的带宽利用率。
服务提供商
我想你会在这里得到某种请求-回应。为此,我将选择一个简单的基于REST的API,而不是HTTP,讨论JSON。如果有效负载相当大,则切换协议缓冲区的JSON有效负载,但在大多数情况下,JSON可能工作得很好。
所有这些都会给你一个坚实、高效、可靠、跨平台和简单的解决方案.
发布于 2013-01-13 00:20:54
看看ZeroMQ指南中的Zyre项目(第8章)。这是一个相当完整的本地网络发现和消息传递框架,一步一步地开发。您肯定可以重用UDP广播和发现,其他的也可以重用。还有一个完整的Java实现,https://github.com/zeromq/zyre。
发布于 2013-01-12 17:53:21
我将使用JMS,因为它可以跨平台(至少对于客户机),您仍然需要决定如何对数据进行编码,除非您有具体的想法,否则我将使用XML或JSon,因为它们易于阅读和检查。
您可以使用ZeroMQ实现更高的性能和更低级别的访问。除非你知道你需要这个,否则我怀疑你不需要。
您可以从JMS的更高级别的特性中获益。
顺便说一句:这些服务隐式地进行服务发现。除了监视之外,不需要知道IP地址,也不需要知道服务是向上的还是向下的。他们的设计假设你想不想知道这些细节。
https://stackoverflow.com/questions/14296070
复制相似问题