2011-11-09 2 views
2

私はBC & Dは、数Xを持つすべてのメッセージのクライアントをし、私はそれがサーバーのための可能な方法を知っていただきたいと思いJavaクライアントサーバープログラミング:サーバーからすべてのクライアントスレッドにメッセージを渡す方法は?

D.

、サーバーAと複数のクライアントB、Cでプログラムを作成していますすべてのクライアントに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);  
     } 
} 
+0

[クライアントから読み取り、Javaのサーバーソケットを介して別のクライアントに送信する方法]の複製可能性(http://stackoverflow.com/questions/5914520/how-to-read-from -aクライアントとサーバ間のソケットソケットを介した別のクライアント) –

答えて

1

グーグルアップJMSパブリッシュおよびサブスクライブです。

基本的には: サーバーはトピックに公開し、クライアントはトピックを購読します。

1

クライアントに何かについて通知する最も良い方法は、JMXを使用することです。この技術を使用することになっていない場合は、クライアントのコードのどこかに静的なフィールドのリストを保持してから、このリストを繰り返して受信した番号を送信してください。

1

私はあなたが何であるか分かりませんしようとしましたが、ソケットプログラミングを使ってメッセージをブロードキャストすることができます。 Check this out

1

すべてのソケットをコレクションに追加できます。コレクション内のすべてのソケットに同じメッセージを送信します。クローズ時にコレクションからソケットを削除します。

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

私はクライアント/サーバプログラミングには全く新しいですが、どうすれば個々のクライアントソケットをac ollection? "extends Thread"クラスでソケット変数を取り出し、この値をコレクションに格納するのは簡単なのでしょうか?このアプローチは、JMXを使用するよりも私の問題に適しています。 – MindDrip

+0

@MindDrip、私は例を追加しました。 –

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 
    } 
} 
1

説明に基づいて、マルチキャストプロトコルを探しています。
だから、私はあなたがこれを見ているのより良いだろうと思います:JDKのバージョン1.4.2から始まる
Multicast (JDK 6)
Multicast (JDK 7)
以前のバージョンでは、マルチキャスト含まれていますが、JDKのバージョンを使用する場合は、ほうが良いでしょう6以上;)