2016-10-08 14 views
2

私は少しのインスタントメッセージングアプリケーションのためのサーバークラスを作成しています。サーバーを単一のクライアントに接続しようとするとすべてが機能していますが、複数のクライアントに接続するように拡張しようとしています。私はテストして、複数のクライアントに接続することができますが、問題は、同時にすべての入力を読み取ることができないという事実にあります。一度に複数のクライアントから入力を読み取る方法は?

入力を常に確認するためにクライアントごとに新しいスレッドを開く必要がありますか?私はこれが非常に非効率的だと感じます。

これは、クライアントからの入力をチェックするコードで、現在はArraylistに格納されています。私はスキャナに似ていると信じていますが、入力があるまでコードを続行しません。

private void chat() throws IOException{ 
    String message = " You are now connected! "; 
    sendMessage(message); 
    ableToType(true); 
    do{ 
     try{ 
       //right now it is only checking the first (0) client 
       message = (String) inputs.get(0).readObject(); // this is the line that checks for inputs 
      showMessage("\n" + message, new java.awt.Color(20, 124, 34)); 
     }catch(ClassNotFoundException classNotFoundException){ 
      showMessage("\nUnreadable Message Sent by Client"); 
     } 
    }while(!message.contains("END")); 

} 
+0

この単純な例を使用している場合、java.nioパッケージをチェックして、1つのスレッドまたはほんの数のスレッドで多くの接続を処理する方法を調べることもできます。 –

答えて

0

簡単な解決策は以下のとおりです。あなたは、サーバー上のつの完全なスレッド...クライアントあたりを捧げます。

しかし、あなたがすでに考えているように、それはむしろ非効率的です。ほとんどのスレッドがほとんどの時間待機しているからです。そして2016年にさえ。スレッドはまだ「高価」です。あなたはそれらを浪費したくないという意味です。

したがって、プールを使用するソリューションを検討することができます。意味:あなたのサーバはプールnスレッドを持っていて、一緒にmクライアント(ここでmはnよりもはるかに大きい可能性があります)で動作します。開始点の1つはtutorialです。

:「学習目的」でこれを実行している場合。次に私は示唆しています: "クライアントごとに1つのスレッド"のアプローチを最初に行ってください。この種の実装を正しく動作させるには、困難な作業になります(マルチスレッド化は、複数の問題を迅速に解決します)。最初にそのパズルを解く。プールを使って次のレベルに進みます!

あなたは、1台のサーバーといくつかのクライアントを持つ「学習」セットアップでは、ローカルマシンに5つのスレッドまたは10があるかどうかは関係ありません。私たちがmという方法で100、500、..を超えてあなたの現在のコードがどのように見えるかについて話すと、プーリングは面白くなります。とにかくそれを "遊んでいる"と思っています。だから、ハードボールになる前にソフトボールを始める。

+0

そして、匿名のダウンボッターのおかげで。あなたの意見で私の質問をどのように改善しなければならないかに関するコメント? – GhostCat

+0

迅速な対応に感謝します。私は実際にはいくつかのクライアントを接続する必要はないので、クライアントごとに新しいスレッドを開き、クライアントの数を制限すると思います。そのチュートリアルは非常に役立つように見えます。私がこれをさらに拡張する必要がある場合、私は将来このチュートリアルを使用します。 –

+0

あなたは大歓迎です。 – GhostCat

関連する問題