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

时间:2011-11-09 17:20:55

标签: java client distributed-computing

我正在创建一个包含服务器A和多个客户端B,C,D的程序。

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

目前,它只会更新上次传递号码X的客户。

这是我运行的代码()

public void run(){
        String number;
        do
        {
            //Accept message from client on
            //the socket's input stream...
            received = in.readLine();

            //Echo message back to client on
            //the socket's output stream...
            out.println("Number recieved: " + number);      
        }
}

6 个答案:

答案 0 :(得分:1)

Google up JMS Publish and Subscribe。

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

答案 1 :(得分:1)

通知客户有关某事的最佳方法是使用JMX。如果您不应该使用此技术,那么您应该将客户列表保存在代码中的某个位置(例如在静态字段中),然后迭代此列表并发送收到的数字

答案 2 :(得分:1)

我不确定你要做什么......但你可以尝试使用套接字编程来广播消息。检查this

答案 3 :(得分:1)

您可以将所有套接字添加到集合中。将相同的消息发送到集合中的每个套接字。关闭时从集合中删除套接字。

e.g。

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);
      }
}

答案 4 :(得分:1)

我同意真正的解决方案是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
  }
}

答案 5 :(得分:1)

您正在寻找基于您的描述的多播协议 所以,我猜你会更好看这个:
Multicast (JDK 6)
Multicast (JDK 7)
从JDK 1.4.2版本开始的早期版本包括多播,但如果您使用JDK版本6或更高版本,则会更好;)