Java 如何在并发客户端之间广播消息?

Java 如何在并发客户端之间广播消息?,java,concurrency,broadcast,broadcasting,Java,Concurrency,Broadcast,Broadcasting,我有许多并发客户机,即线程并发运行和执行某些操作。 每个客户机实现某个事件总线的侦听器。 来自该总线的消息可以到达一个或多个客户端。 我的任务是向所有客户广播这条信息 这项任务似乎很简单,但我找不到一个在某种程度上不丑陋的解决方案 (1) 简单的解决方案是: void onMessageArrived(Message message) { broadcast(message); } 这是不好的,因为每个消息都将被广播多次,因为多个客户端可以接收该消息,因此可以运行多个OnMessage

我有许多并发客户机,即线程并发运行和执行某些操作。 每个客户机实现某个事件总线的侦听器。 来自该总线的消息可以到达一个或多个客户端。 我的任务是向所有客户广播这条信息

这项任务似乎很简单,但我找不到一个在某种程度上不丑陋的解决方案

(1) 简单的解决方案是:

void onMessageArrived(Message message) {
   broadcast(message);
}
  • 这是不好的,因为每个消息都将被广播多次,因为多个客户端可以接收该消息,因此可以运行多个OnMessageDrive处理程序
(2) 我们可以将广播的消息存储在一些列表中:

void onMessageArrived(Message message) {
 if (alreadyBroadcastedConcurrentMap.putIfAbsent(message)==null) {
     broadcast(message);
 }
}
  • 这解决了前面提到的问题,但许多客户机将重复将已经存在的消息放入该列表的无用操作
但可能有更好的选择吗


Java。

问题在于,您首先会收到多条消息。从理论上讲,如果您应该收到5个广播请求,那么按照事件系统的工作方式应该进行5次广播。简单地说,如果这不是您想要的,那么您不应该使用此模式

如果接收多条消息不是您可以控制的,那么至少,传递消息的接收者应该注意重复的消息并忽略它们,而不是将它们传递到其他线程


简而言之,线程只执行它被告知的内容。它不必担心另一个线程的状态,因此在将消息传递给线程之前,您应该切换模式或拦截消息。

您的设计存在缺陷,或者解释得不好。您希望广播到所有客户端,或多播到选定列表。指定一些收件人,然后让每个收件人负责将其交付给所有其他客户机,手工处理重复和竞争,这是没有意义的。只需让所有客户机都收听总线,可能会忽略消息

我要介绍一个新的中央
广播公司

public class Broadcaster {

  List<Client> clients;

  public void broadcast(Message msg) {
    for (Client client: clients)
      if (!msg.from().equals(client))
        msg.send(client);
  }
}

忘记多次送货吧。如果客户端数量庞大,并且您有其他非常严格的要求,那么您可以更进一步,通过使用多个广播域来模拟LAN—我认为您没有

Raffaele,实际上我有很多聊天室,还有一个管理员,应该向所有聊天室广播哪个命令。我想抓住这个时刻,当这个命令到达他的聊天室,然后广播到他缺席的聊天室。这就是我问的原因。但是你和尼尔说得对,最好是改变架构。我将发送管理信息作为内部命令,没有在聊天中听他们在所有。谢谢