1

Java ソケットの動作を取得しようとしています。問題は、ソケット Java API を使用している場合に同時に何ができるか、そしてデータの送信と読み取りに多少の遅延があるとどうなるかということです。

  1. 一度に読み書き。1 つのソケットクライアントが 1 つの spcket-server に接続されている場合、それらは同時に読み取りと書き込みの両方を行うことができますか? 私の知る限り、TCP プロトコルは全二重なので、理論的にはソケットは 1 つで読み書きできるはずですが、ボット クライアントとサーバー用に 2 つのスレッドを作成する必要があります。私は正しいですか?

  2. 一度に N 個のクライアントに書き込みます。複数のソケットクライアントが 1 つのソケットサーバーに接続されている場合、サーバーは一度に複数のクライアントを読み取ることができますか? サーバーは一度に複数のクライアントに書き込むことができますか? NetworkCard の最大物理速度が 1kbyte/sec で、クライアントを 5 台接続した場合、1 台のクライアントに書き込み可能な速度はどれくらいですか?

  3. 双方向でのデータの順次送信を実装するにはどうすればよいですか? つまり、サーバーからクライアントに N バイト、次にクライアントからサーバーに M バイト、次にサーバーからクライアントに N バイトを送信したいということです。問題は、両側のいずれかがチャネルに何かを書き込んだ場合、反対側が停止することです。そのデータを読み取る (read() == -1) のは、チャネルが閉じている場合のみです。つまり、チャネルを再利用することはできず、別の接続を開く必要があります。それとも、接続が閉じられるまで read() と write() で仕事をする別のスレッドにリーダーとライターを配置する必要がありますか?

  4. write(); を呼び出す間に遅延があると想像してください。一方では flush() を、もう一方では read() を呼び出します。遅延中 - 書き込まれたデータはどこに保存されますか? 伝わるでしょうか?「間」のどこかに保存される「遅延」データの最大サイズはどれくらいですか?

4

1 に答える 1

1
  1. 正しい。ブロッキング I/O を使用している場合は、接続ごとにリーダー スレッドとライター スレッドが必要になりますSocket

  2. 単一のスレッドを使用して一度に N 個のクライアントに書き込むこともできますが、書き込みがブロックされるリスクがあります。いくつかの要因に依存するため、ここでは書き込み速度については説明しませんが、明らかに、すべてのクライアントへの累積書き込み速度は 1kbps 未満になります。

  3. はい、2 つのスレッドが必要です。1 つのスレッドでこれを行うことはできません (または可能ですが、自分で言ったように、接続を常に開いたり閉じたりする必要があります)。

  4. どこかのバッファに格納されます。コードによっては、バッファリングされたストリームまたはソケット自体のバッファにある可能性があります。のデフォルトのバッファ サイズBufferedOutputStreamは 8K で、ソケット自体のバッファは環境に依存すると思います。それほど重要ではありませんが、TCP/IP のストリーミング品質により、本当に微調整を行う必要がない限り、バッファについて考える必要がなくなります。

于 2013-11-12T13:32:49.933 に答える