Программирование Java Client Server: как передать сообщение с сервера на все потоки клиента? - PullRequest
2 голосов
/ 09 ноября 2011

Я создаю программу с сервером A и несколькими клиентами B, C, D.

BC & 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 ]

1 голос
/ 20 ноября 2011

Вы ищете протокол многоадресной рассылки на основе ваших описаний.
Итак, я думаю, вы будете выглядеть лучше:
Multicast (JDK 6)
Multicast (JDK 7)
Предыдущие версии, начиная с JDK версии 1.4.2, включают многоадресную рассылку, но вам будет лучше, если вы будете использовать JDK версии 6 или выше;)

1 голос
/ 10 ноября 2011

Я согласен, что реальным решением является 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
  }
}
1 голос
/ 09 ноября 2011

Вы можете добавить все сокеты в коллекцию.Отправьте одно и то же сообщение на каждый сокет в коллекции.Удалите розетки из коллекции, когда они закрыты.

например

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);
      }
}
1 голос
/ 09 ноября 2011

Я не уверен, что вы пытаетесь сделать ... но вы можете попробовать передать сообщение с помощью программирования сокетов. Проверьте это из

1 голос
/ 09 ноября 2011

Лучший способ уведомить клиентов о чем-либо - использовать JMX. Если вы не должны использовать эту технологию, вам следует сохранить список клиентов где-нибудь в вашем коде (скажем, в статическом поле), а затем выполнить итерацию по этому списку и отправить полученный номер

1 голос
/ 09 ноября 2011

Google up JMS Публикация и подписка.

В основном: сервер публикует тему, а клиенты подписываются на тему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...