0

我正在开发一个将与 LAN 中的服务器连接的多客户端应用程序。

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

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

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

当客户端发送一个改变 ServerStatus 的命令时,服务器会将他当前的(和新的)ServerStatus 发送到同一个多播组,而在另一个线程中,ServerStatus 的版本号仍然是每秒共享的。

各位小伙伴觉得这样处理好不好?或者这会导致太多问题,......等等

4

2 回答 2

1

如果新的 ServerStatus 无法到达客户端会怎样?在我看来,向客户端发送新状态时不应使用 UDP,而应使用可靠的协议。因此,如果您打算在此使用多播,则必须获得可靠的多播协议


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

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

  • 离开时,客户端可以发送 UNREGISTER 消息 (UDP)。

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

  • 如果服务器没有收到确认,则相关客户端将被取消注册(因为这意味着客户端在没有取消注册的情况下离开了网络 - 错误)。

希望这可以帮助..

于 2012-10-22T15:10:00.260 回答
1

基本上,您的想法对我来说听起来不错,我
建议您深入研究“组通信”的原理,并查看诸如jGroups 之类的框架,我知道 JBoss Cache 使用它在其节点之间分配数据。
也许为了可靠性,客户端还应该在 X 秒内查询一次服务器,以查看它们是否具有正确的版本号,
或者至少在它们启动/从崩溃中恢复时执行此操作。

于 2012-10-22T15:40:45.057 回答