Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java客户机-服务器编程:如何将消息从服务器传递到所有客户机线程?_Java_Client_Distributed Computing - Fatal编程技术网

Java客户机-服务器编程:如何将消息从服务器传递到所有客户机线程?

Java客户机-服务器编程:如何将消息从服务器传递到所有客户机线程?,java,client,distributed-computing,Java,Client,Distributed Computing,我正在创建一个带有服务器a和多个客户端B、C、D的程序 B C&D将用数字X向所有客户端发送消息,我想知道服务器如何能够同时向所有客户端发送X的最新值 目前,它将只更新最后一次通过数字X的客户机 下面是我为run()编写的代码 谷歌上JMS发布和订阅 基本上: 服务器发布到一个主题,客户端订阅一个主题。通知客户端某些事情的最佳方法是使用JMX。如果您不应该使用这种技术,那么您应该在代码中的某个位置保留客户端列表(比如在静态字段中),然后迭代该列表并发送接收号码。我不确定您要做什么……但您可以尝试

我正在创建一个带有服务器a和多个客户端B、C、D的程序

B C&D将用数字X向所有客户端发送消息,我想知道服务器如何能够同时向所有客户端发送X的最新值

目前,它将只更新最后一次通过数字X的客户机

下面是我为run()编写的代码


谷歌上JMS发布和订阅

基本上:
服务器发布到一个主题,客户端订阅一个主题。

通知客户端某些事情的最佳方法是使用JMX。如果您不应该使用这种技术,那么您应该在代码中的某个位置保留客户端列表(比如在静态字段中),然后迭代该列表并发送接收号码。我不确定您要做什么……但您可以尝试使用套接字编程广播消息。签出

您可以将所有套接字添加到集合中。向集合中的每个套接字发送相同的消息。关闭插座后,将其从集合中移除

e、 g

final List sockets=new CopyOnWriteArrayList();
//当你有一个新的插座
sockets.add(socket);
//当你有一个死插座。
插座。拆下(插座);
//将同一消息发送到多个套接字。
公共静态void sendToAll(字节[]字节){
用于(插座s:插座)
试一试{
s、 getOutputStream().write(字节);
}捕获(ioe异常ioe){
//处理异常,关闭套接字。
插座。拆除;
}
}

我同意真正的解决方案是JMS,但如果您想“自己动手”,我建议您使用相同的JMS思想制作自己的简化版本。创建一个将从客户端接收事件的类。创建一个您的客户端可以实现的接口,然后将自己添加为这个新类的侦听器。一些简单的代码:

class MyEventPublisher {
  Collection<EventListener> listeners;

  int number;

  public void addListener(EventListener listener) {
    listeners.add(listener);
  }

  public void setNumber(int newNumber) {
    int oldNumber = this.number;
    this.number = newNumber;
    for (EventListener listener : listeners) {
      listener.numberChanged(newNumber, oldNumber);
    }
  }
}

interface EventListener {
  void numberChanged(int newNumber, int oldNumber);
}

class MyClientSocket implements EventListener {
  MyEventPublisher publisher;

  public MyClientSocket(MyEventPublisher publisher) {
    this.publisher = publisher;
    publisher.addListener(this);
  }

  public recieveNumberFromSocket() {
    int numberFromSocket = readNumber();
    publisher.setNumber(numberFromSocket);
  }

  public void numberChanged(int newNumber, int oldNumber) {
    //someone else changed the number
    //do something interesting with it
  }
}
类MyEventPublisher{
收集听众;
整数;
公共void addListener(EventListener listener){
添加(侦听器);
}
公共无效集合号(int newNumber){
int oldNumber=这个.number;
this.number=newNumber;
for(EventListener:侦听器){
listener.numberChanged(newNumber,oldname);
}
}
}
接口事件侦听器{
无效编号更改(整数新编号、整数旧编号);
}
类MyClientSocket实现EventListener{
MyEventPublisher出版社;
公共MyClientSocket(MyEventPublisher发布者){
this.publisher=publisher;
publisher.addListener(this);
}
公共ReceiveNumber FromSocket(){
int numberFromSocket=readNumber();
publisher.setNumber(numberFromSocket);
}
已更改公共无效编号(整数新编号、整数旧编号){
//有人换了号码
//用它做些有趣的事
}
}

根据您的描述,您正在寻找多播协议。
所以,我想你最好看看这个:



从JDK版本1.4.2开始的早期版本包括多播,但如果您使用JDK版本6或更高版本,您会感觉更好;)

可能重复我对客户机-服务器编程很陌生,如何将每个单独的客户机套接字存储在一个集合中?这是在“extends Thread”类中获取套接字变量并将该值存储在集合中的简单情况吗?这种方法比使用JMX更适合我的问题。@MindDrip,我添加了一些示例。
final List<Socket> sockets = new CopyOnWriteArrayList<Socket>();

// when you have a new socket
sockets.add(socket);

// when you have a dead socket.
sockets.remove(socket);

// to send the same message to multiple sockets.

public static void sendToAll(byte[] bytes) {
    for(Socket s: sockets)
      try {
       s.getOutputStream().write(bytes);
      } catch (IOException ioe) {
       // handle exception, close the socket.
       sockets.remove(s);
      }
}
class MyEventPublisher {
  Collection<EventListener> listeners;

  int number;

  public void addListener(EventListener listener) {
    listeners.add(listener);
  }

  public void setNumber(int newNumber) {
    int oldNumber = this.number;
    this.number = newNumber;
    for (EventListener listener : listeners) {
      listener.numberChanged(newNumber, oldNumber);
    }
  }
}

interface EventListener {
  void numberChanged(int newNumber, int oldNumber);
}

class MyClientSocket implements EventListener {
  MyEventPublisher publisher;

  public MyClientSocket(MyEventPublisher publisher) {
    this.publisher = publisher;
    publisher.addListener(this);
  }

  public recieveNumberFromSocket() {
    int numberFromSocket = readNumber();
    publisher.setNumber(numberFromSocket);
  }

  public void numberChanged(int newNumber, int oldNumber) {
    //someone else changed the number
    //do something interesting with it
  }
}