在LAN-Java网络中保持客户端更新的最佳方法

在LAN-Java网络中保持客户端更新的最佳方法,java,networking,udp,multicast,lan,Java,Networking,Udp,Multicast,Lan,我正在开发一个多客户端应用程序,它将与局域网中的服务器连接 每个客户端都可以发送更改服务器状态的命令。 我将称之为“ServerStatus”,它是一个具有某些值的对象 现在,如果服务器状态发生变化,所有客户端都应该立即知道。 我的想法是这样工作: 服务器每秒向所有侦听客户端发送一个版本号为ServerStatus的多播。因此,如果一个新客户加入多播组,他将看到他的版本号是否相同。 如果没有,客户端将通过UDP询问服务器状态的当前版本 当客户端发送更改服务器状态的命令时, 服务器将其当前(和新)

我正在开发一个多客户端应用程序,它将与局域网中的服务器连接

每个客户端都可以发送更改服务器状态的命令。 我将称之为“ServerStatus”,它是一个具有某些值的对象

现在,如果服务器状态发生变化,所有客户端都应该立即知道。 我的想法是这样工作:

服务器每秒向所有侦听客户端发送一个版本号为ServerStatus的多播。因此,如果一个新客户加入多播组,他将看到他的版本号是否相同。 如果没有,客户端将通过UDP询问服务器状态的当前版本

当客户端发送更改服务器状态的命令时, 服务器将其当前(和新)服务器状态发送到同一多播组, 在另一个线程中,ServerStatus的versionnumber仍然每秒共享一次

你们觉得这是个好办法吗?
或者这会导致太多的问题,。。。etc

如果新服务器状态无法到达客户端,会发生什么情况?在我看来,在向客户端发送新状态时不应该使用UDP,而应该使用可靠的协议。因此,如果您打算在这个平台上使用多播,您必须获得一个许可证


另一方面,您可能更喜欢客户端与服务器同步:

  • 每次客户端进入网络时,它都会向服务器询问其状态ID(如果不相同,则服务器会向其发送ServerStatus),并且客户端还会注册新的状态更改事件。(TCP)

  • 离开时,客户端可以发送一条注销消息(UDP)

  • 每次ServerStatus更改时,服务器都会将新的ServerStatus发送给每个注册的客户端。在接收到新的服务器状态时,客户端将向服务器发送一个类似的ack。(TCP)

  • 如果服务器未接收到ack,则相关客户端将被注销(因为这将意味着客户端已离开网络而没有注销-由于错误)


希望这有帮助。

基本上,你的想法对我来说很好
我建议您深入研究“”的原理,并查看一些框架,例如,我知道JBoss缓存使用它在其节点之间分发数据
也许为了可靠性,客户端还应该每隔X秒查询服务器一次,以查看他们是否拥有正确的版本号,
或者至少在启动/从崩溃中恢复时执行此操作。

UDP多播(如果您有if,即它可用),这是一个好方法。1秒不是“立即”的,因此客户端只是多播更新请求,服务器(甚至对等方)可以更新新加入的请求。您可能需要处理丢失(或无序)的UDP数据包。有很多框架可以实现这一点——jgroups、akka等等。