Java 在局域网上向所有人广播

Java 在局域网上向所有人广播,java,udp,thrift,zeromq,Java,Udp,Thrift,Zeromq,我正在尝试与局域网上的每个人联系,以了解哪些设备当前正在使用ip并运行我的服务。运行该服务的每个设备在联机时都会知道连接了哪些其他设备。我有基本的网络经验(tcp/udp),但我没有对更复杂的通信包做太多工作。我想发布我迄今为止的研究/尝试,并获得一些专家的回复,以限制我在未来潜在解决方案上的尝试和错误时间 要求: 目前正在使用java,但需要跨语言通信 必须在可接受的时间范围内(最多几秒钟)完成,最好可靠 我希望在广播和以后的通信中使用类似的技术,以避免增加多个包/技术的复杂性 目前,我正计

我正在尝试与局域网上的每个人联系,以了解哪些设备当前正在使用ip并运行我的服务。运行该服务的每个设备在联机时都会知道连接了哪些其他设备。我有基本的网络经验(tcp/udp),但我没有对更复杂的通信包做太多工作。我想发布我迄今为止的研究/尝试,并获得一些专家的回复,以限制我在未来潜在解决方案上的尝试和错误时间

要求:

  • 目前正在使用java,但需要跨语言通信
  • 必须在可接受的时间范围内(最多几秒钟)完成,最好可靠
  • 我希望在广播和以后的通信中使用类似的技术,以避免增加多个包/技术的复杂性
  • 目前,我正计划对已知的ip进行心跳,以提醒仍然连接的ip,但我可能希望以后继续向lan广播
  • 我对为这个服务使用跨语言rpc通信感兴趣,但是这种技术不一定要使用它
  • 后期通信(非广播)必须可靠
研究和尝试的事情:

  • UDP-担心跨语言通信,缺乏可靠的传输,并且会添加另一种通信方式,而不是使用下面的解决方案。如果能找到另一个更完整的解决方案,我宁愿避免它

  • Apache Thrift-目前,我已尝试迭代所有可能的ip,并尝试连接到每个ip。这太慢了,因为每次尝试连接的超时时间都很长(当我调用open时)。我还没有找到任何广播选项

  • ZeroMQ—使用基本ZeroMQ进行的测试很少,但我过去只使用过它的包装器。发布/订阅功能似乎对这种情况很有用,但我担心订阅局域网中的每个ip。还担心当尝试订阅尚未运行服务的ip时会发生什么

考虑到我的要求,这些建议中有哪一个看起来比其他建议更有效?您对可能更有效的技术还有其他建议吗


谢谢。

我会使用JMS,因为它可以跨平台(至少对客户端而言)您仍然需要决定如何编码数据,除非您有具体想法,否则我将使用XML或JSon,因为它们易于阅读和检查

您可以使用ZeroMQ实现更高的性能和更低级别的访问。除非你知道你需要这个,否则我怀疑你不需要

您可能会受益于JMS的更高级别特性


顺便说一句:这些服务隐式地进行服务发现。没有特别需要(除了监控)了解IP地址或服务是否正常。他们的设计假设您想要保护自己不受这些细节的影响。

您指定的基本上是两个独立的问题;发现/监视和服务提供商。由于这两个问题有些正交,我将使用两种不同的方法来实现这一点

发现/监测 让每个设备在预定义端口上通过UDP在LAN上连续广播(小)心跳/状态消息。此心跳信号应包含设备的ip/端口(发送方)以及其他有趣的数据,例如该设备提供的服务的地址(URL)。如果需要降低带宽利用率,请选择一种紧凑的消息格式,例如协议缓冲区(多种语言可用)或JSON,以提高可读性。这些信息应定期发布,例如每5秒发布一次

现在,让每个设备监听广播地址上的传入消息,并保留所有已知设备的内存映射[发送者,上次记录的时间+其他数据]。每隔一秒钟迭代一次映射,并删除在x次心跳间隔(例如3 x 5秒)内保持沉默的发件人。这样,每个节点都将了解所有其他响应节点

您不必知道任何IP:s,不需要任何额外的目录服务器,也不需要迭代所有可能的IP地址。此外,通过UDP发送/接收数据比通过TCP发送/接收数据要简单得多,并且不需要任何连接。它还产生更少的开销,这意味着更少的带宽利用率

服务提供商 我想你会喜欢这里的某种请求-响应。为此,我将选择一个简单的基于REST的API,而不是HTTP,即JSON。如果您的负载相当大,请为协议缓冲区切换JSON负载,但在大多数情况下,JSON可能工作得很好


总之,这将为您提供一个可靠、高性能、跨平台且简单的解决方案。

请查看ZeroMQ指南(第8章)中的Zyre项目。它是一个相当完整的本地网络发现和消息传递框架,逐步开发。您完全可以重用UDP广播和发现,其他的也可以。还有一个完整的Java实现。

UDP和跨语言通信在这里并不重要:现在所有的服务发现协议都使用UDP。如果有没有,我想听听。另外,当谈到TCP/IP协议栈时,UDP是三级协议,你引用的其他协议是四级协议。哦,现在常用的三级协议中,只有UDP可以进行广播。TCP做不到。谢谢@fge。我意识到协议级别的差异,我只是想列出我所研究的内容(可能有点不公平)。附带问题:考虑到应用层选项,现在在大型生产代码中仍然使用简单套接字是否很常见?考虑到目前的选择,这似乎相当有限。谢谢。不幸的是,很多现有的选项都猜测您使用HTTP。你真的想要