2

Java SocketChannel について質問があります。

ブロッキング モードで開いているソケット チャネルがあるとします。write(ByteBuffer)メソッドを呼び出した後、書き込まれたバイト数を表す整数を取得します。javadoc は次のように述べてい ます。 「戻り値: 書き込まれたバイト数、おそらくゼロ」

しかし、これは正確にはどういう意味ですか?これは、バイト数が実際にクライアントに配信されたことを意味しますか (サーバーが受信したバイト数を明らかにする tcp ack を送信者が受信したように)、またはバイト数が tcp スタックに書き込まれたことを意味しますか? ? (そのため、一部のバイトがまだ待機している可能性があります (ネットワーク カード バッファなど)。

4

2 に答える 2

5

これは、バイト数が実際にクライアントに配信されたことを意味しますか?

いいえ。単純に、ローカル ネットワーク スタックに配信されるバイト数を意味します。

データがリモート アプリケーションに配信されたことを確認する唯一の方法は、データに対するアプリケーション レベルの確認応答を受信することです。

于 2010-09-13T12:08:45.263 に答える
0

あなたを混乱させる段落は、ノンブロッキング I/O に関するものです。

非ブロッキング操作の場合、最初の呼び出しでは、呼び出し時に何も書き込まない場合があります。

特に指定がない限り、書き込み操作は、要求されたすべてのバイトを書き込んだ後にのみ返されます。一部のタイプのチャネルは、その状態に応じて、一部のバイトのみを書き込むか、まったく書き込まない場合があります。たとえば、非ブロッキング モードのソケット チャネルは、ソケットの出力バッファで空き容量を超えるバイトを書き込むことはできません。

ご覧のとおり、ブロック I/O の場合、すべてのバイトが送信されます (または send の途中で例外がスローされます)。

バイトがいつ受信側に表示されるかについての保証はないことに注意してください。これは完全に低レベルのソケット プロトコル次第です。

于 2010-09-13T12:15:12.697 に答える