【问题标题】:Java Client Server Programming: How to pass message from server to All Client threads?Java客户端服务器编程:如何将消息从服​​务器传递到所有客户端线程?
【发布时间】:2011-11-09 17:20:54
【问题描述】:

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

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

就目前而言,它只会更新最后通过数字 X 的客户端。

这是我的 run() 代码

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

【问题讨论】:

标签: java client distributed-computing


【解决方案1】:

Google up JMS 发布和订阅。

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

【讨论】:

    【解决方案2】:

    通知客户某事的最佳方式是使用 JMX。如果您不应该使用这项技术,那么您应该将客户列表保留在代码中的某个位置(例如在静态字段中),然后遍历该列表并发送接收到的号码

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        例如

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

        【讨论】:

        • 我是客户端-服务器编程的新手,如何将每个单独的客户端套接字存储在一个集合中?在“扩展线程”类中获取套接字变量并将此值存储在集合中是否是一个简单的案例?这种方法比使用 JMX 更适合我的问题。
        • @MindDrip,我已经添加了示例。
        【解决方案5】:

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-05-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-01-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多