2011-02-01 4 views
2

つのサーバーの複数のクライアント

  1. 私は、サーバープログラムを書く必要は、すべてのクライアントが、たとえば、株価をサーバーから同じデータをサブスクライブしている複数のクライアント
  2. を受け付けます更新。私は非常にマルチスレッド/ TCPでexperiancedおりませんので
  3. 各クライアントはだからここ

を「停止」、「ログオン」のように、サーバーに簡単なコマンドを送信することができますが、私の解決策ですが、私は知りたいことは良いです溶液?そうでない場合は、よりよい解決策がありますか?クライアントソケットごとにスレッドが必要ですか?ありがとう ご参考までに:すべての人を混乱させて申し訳ありません、それは5-10クラスだけを含む小さなプロジェクトです。

class AcceptThread { 
    ...... 
    public void run() { 
     ControlThread controlThread = new ControlThread(); 
     controlThread.start(); 

     Socket socket = new Socket(port); 
     while (!stop) { 
      Socket s = socket.accept(); 
      controlThread.addClient (s); 
     } 
    } 
} 

class ControlThread { 
    Set<Scoket> clients; 
    SendDataThread sendDataThread; 

    public ControlThread() { 
     sendDataThread = new SendDataThread(); 
     sendDataThread.start();  
    } 

    public void addClient (Socket socket) { 
     clients.add(socket); 
     sendDataThread.addListener(socket); 
    } 

    public void run() { 
     ...... 
     for (Socket s : clients) { 
      if (s.getInputStream().available()) { 
       //read command from s 
      } 
     } 
     ......    
    } 
} 

class SendDataThread() { 
    Set<Scoket> listeners; 

    public void addListener (Socket s) { 
     listeners.add(s); 
    } 

    public void run() { 
     for (Socket s: listeners) { 
      // send data to each listener 
     } 
    } 
} 
+0

宿題でなければ、ゼロから始める代わりに[JMS](http://en.wikipedia.org/wiki/Java_Message_Service)のような既存のソリューションを見てください。 –

+0

ソケットは受け入れられません。 – JasonHuang

答えて

3

それは、各クライアントソケットのためのスレッドを持っている必要があるのでしょうか?

いいえ、実際には、私はそれをお勧めしません。小さなプロジェクトで、既存のライブラリを使用したくない場合は、java.nio packageSelectableChannelsを使用することをお勧めします。いわゆるセレクタを使用すると、着信データのクライアントをノンブロッキングで簡単に監視できます。ここで

は、いくつかの有用なリンクです:

0

何この問題を解決するための標準技術を使用してはどうですか?

JMSトピック 複数の加入者に を配信されたメッセージを公開するための分配メカニズム。ところで

Tutorial

+1

JMSシステムはやや重く、大規模に使用されない限りは本当に効果がありません。さらに、軽量アプリケーションサーバーを使用してサポートすることもできます(たとえば、tomcat/jettyの代わりにjbossなど)。しかし、適切なプロジェクトでは良いと便利なテクニック。 –

+0

あなたが正しいです、私が話しているプロジェクトは小さなプロジェクトです、私のソリューションは小規模なプロジェクトのために良いものだと思いますか? – Leon

+0

私には、半分の有効性がありますが、ソケットソケットは2倍の楽しみです。そこには多くの良い高レベルの助けが存在しますが、あなた自身でソケットプログラミングを書くことに根本的に間違ったものはありません。 –

0

ありがとう:一人一人を混乱させて申し訳ありませんが、それだけで5-10のクラスを伴う小規模なプロジェクトです。

これは間違いありません。より高いレベルの抽象化はすべて、ある方法または別の方法でソケットに基づいています。あなたのプロジェクトが十分に大きい場合を除いて、同じ仕事を実行するために他のフレームワーク/ツールキットを連載する必要はありません。スレッドは安価であり(マルチコアアーキテクチャの恩恵を受けることさえできます)、@aioobeとしてSelectableChannelsを使用することは悪い考えでもありません。

プロジェクトで必要な場合は、他のプロセス間通信方法(メッセージパッシング、リモートメソッド呼び出しなど、およそ100の実装)をいつでも学ぶことができます。

ただし、同時に使用するスレッドの数を制限したい場合があります。これは、例えば、提供したいスレッドの数に等しいサイズのセマフォを要求することによって容易に達成することができる。もう一つ興味深いのは、Javaのthread poolsを使用してリソースをよりうまく再利用することです。

+0

美しい答え。クライアントごとに1スレッドのアプローチは、スレッドプールに簡単には適用できません。なぜなら、クライアントごとに1スレッドというアイデアは、ブロックioを使用できるということだけだからです。ブロッキングioを使用すると、スレッドプールはあまりうまく行かないでしょう。 – aioobe

-1

他にも、nioライブラリを使用して必要なスレッド数を減らすことができます。私はちょうどあなたの現在の例のコードが動作しないことを指摘したい。 標準のIOストリームを使用する場合はソケットごとにスレッドを使用する必要があります。 available()メソッドはほとんど役に立たず(一般的に)、制御スレッドがブロックされることはありません。

+0

downvoterさんにコメントしますか? – jtahlborn

関連する問題