1
byte[] message = ...
Socket socket = ...
DataOutputStream dOut = new DataOutputStream(socket.getOutputStream());

dOut.write(message);  //#1
... //other code 

マシン 1 (上記のコードを使用) が、マシン 1 からバイトを読み取ろうとしているマシン 2 に何かを送信しようとしていると仮定します。

TCP によると、マシン 2 が上から送信されたデータをまだ正常に読み取っていない場合、1 行目以降のコードは実行されないと言えますか?

しかし、どの時点で、マシン 2 が既にデータを読み取り、1 行目以降のコードが実行されると言えますか? オペレーティング システム レベルまたはアプリケーション レベルで発生しますか? たとえば、マシン 2 の OS は、マシン 1 がwriteByteコマンド/ステートメントを実行した直後にマシン 1 からのメッセージをバッファリングするため、マシン 2 はマシン 1 にライン #1 を続行するように信号を送ります。

readByteまたは、マシン 2 は、Java アプリケーションがアプリケーション レベルでコマンド/ステートメントを実行する場合にのみ、マシン 1 に続行するように通知しますか?

受信プロセス全体が OS レベルで発生する場合、(マシン 2 で) 受信データをキャッシュするために使用されるバッファー サイズをどのように制御できますか?

4

3 に答える 3

1

送信者が受信者を待つようにしたい場合、受信者は送信者に何かを送り返す必要があります。通常、TCP が一端と他端の間のすべてのハンドシェイクを処理するため、これは気にする必要はありません。

しかし、どの時点で、マシン 2 が既にデータを読み取り、1 行目以降のコードが実行されると言えますか?

マシン #2 が #1 からのメッセージを読み取ったことを示すマシンを送信した場合

オペレーティング システム レベルまたはアプリケーション レベルで発生しますか?

ほとんどのアプリケーションはこの保証を必要としないため、アプリケーション レベルで。

たとえば、マシン 2 の OS は、マシン 1 が writeByte コマンド/ステートメントを実行した直後にマシン 1 からのメッセージをバッファリングするため、マシン 2 はマシン 1 にライン #1? に進むように信号を送ります。

マシン #1 は、コピーがバッファに配置されるまで待機します。それを #2 マシンのバッファーに入れるのも、読み取られるのも待ちません。

または、マシン 2 は、Java アプリケーションがアプリケーション レベルで readByte コマンド/ステートメントを実行する場合にのみ、マシン 1 に続行するように通知しますか?

追加しない限り、そのような信号は存在しません。

受信プロセス全体が OS レベルで発生する場合、(マシン 2 で) 受信データをキャッシュするために使用されるバッファー サイズをどのように制御できますか?

必要なサイズに設定することで制御できます。ほとんどの場合、これを変更する必要はなく、これ以上のコントロールは必要ありません。

解決しようとしているのは想像ではなく実際のプログラムであり、TCP が既に必要なものを処理していることに気付くかもしれません。

于 2013-07-11T04:13:54.487 に答える