3

私は現在、Javaでtcpサーバーをプログラムする方法を学んでいます。新しい各クライアント接続 (マルチスレッド サーバー) 用に新しいスレッドを作成しています。

クライアントがサーバーに接続した後、クライアントからサーバーにデータを送信したいと考えています。サーバー側では、サーバーはソケット入力ストリームからデータを読み取る while ループにあります。ここで質問したいのですが、受信したパケットごとに新しいスレッドを作成する必要がありますか?

たとえば、クライアントは文字列「Hello」を送信します。サーバーがこのパケットを新しいスレッドで処理して、読み取りを続行できるようにする必要があります。新しいスレッドを作成しないと、サーバーは読み取りに戻らず、クライアントが「Hello」パケットの後に別のパケットを送信すると思うからです。たとえば "Bye" の場合、"Hello" パケットの処理でまだビジー状態である可能性があるため、サーバーはそれを読み取らない可能性があります。

明確にするために、サーバーソケットの受け入れ方法について話しているのではなく、ソケットの入力ストリームからのデータについて話しているのです。

これについて教えてください。

4

3 に答える 3

3

パケット処理タスクがそれほど重くない場合(おそらくそうではない)、そうすべきではありません。スレッドはメッセージを処理し、新しいメッセージの受信に戻ります。データが失われることはありません-誰もinputstreamから読み取らない場合、データ転送は保持されます(すべてのバッファがいっぱいになった後)。クライアントごとに1つのスレッドを保持するだけで、ほとんどの場合はそれで十分です。

于 2012-08-18T10:09:26.403 に答える
2

はい、応答するサーバーを用意するには、別のスレッドに委任する必要があります。いいえ、リクエストごとにスレッドを作成せず (クライアントの負荷が軽微でない限り)、代わりにスレッド プールを使用してください。スケルトン コードの例 (もちろん、何らかの方法でループから抜け出す必要があります):

private static final ExecutorService threadPool = Executors.newCachedThreadPool();  

while(true){  

  final Socket clientConnection = serverSocket.accept();  
  threadPool.execute(new Runnable(){  
            public void run(){  
                  processConnection(clientConnection);  
            });               

}  

受信したパケットごとに新しいスレッドを作成する必要がありますか?

いいえ。各スレッドは独自の接続 (クライアント パケットを受信する) を処理するため、メイン リスナーが接続を受け入れ続けるため、接続しているクライアントはより高速に処理されます。

于 2012-08-18T10:16:56.110 に答える
0

小さなアプリケーションでは、各クライアント接続ごとに 1 つのスレッドで十分です。ただし、各クライアント要求/パケットごとに 1 つのスレッドは、まったく適切なアプローチではありません。サーバーがクライアントと時間内に通信できることを確認してください。

作成するスレッドの数に制限はありません。使用している OS によって異なります。実際のアプリケーションは、このようなケースを処理するためにスレッド プールを使用します。

于 2012-08-18T10:17:26.483 に答える