3

状況によっては、非ブロッキング I/O ( ) を使用してサーバーからクライアントにエラー メッセージを送信し、クライアントをSocketChannel.write(ByteBuffer)切断したいと考えています。メッセージの完全な内容を書き込んですぐに切断すると仮定すると、この時点で OS が実際にデータを送信していないと推測しているため、クライアントはこのメッセージを受信しない可能性があると推測されます。

これは正しいですか? もしそうなら、この状況に対処するための推奨されるアプローチはありますか?

クライアントを切断したい場合はメッセージを送信し、1〜2秒後に接続を閉じるタイマーを使用することを考えていました。

4

3 に答える 3

1

非ブロック モードの SocketChannel.write は、ブロックせずにネットワークにすぐに送信できるバイト数を返します。あなたの質問は、書き込みメソッドがバッファ全体を消費し、非同期的にネットワークに追加のデータを送信しようとすることを期待していると思いますが、それはどのように機能しているとは言えません。

ソケットを切断する前にエラー メッセージがクライアントに確実に送信されるようにする必要がある場合は、write メソッドを呼び出す前にブロッキングを有効にします。ノンブロッキング モードを使用すると、ループ内で write を呼び出し、呼び出しごとに送信されるバイト数をカウントし、メッセージ全体をソケットに渡すことに成功したらループを終了する必要があります (悪い解決策です。不要なコード、ビジー待機など)。

于 2010-02-03T15:21:58.787 に答える
0

スレッドを起動して、チャネルにデータを同期的に書き込む方がよい場合があります。非同期APIは、「1つのスレッドが複数のチャネルをディスパッチする」ことを目的としており、実際にはファイアアンドフォーゲット通信を目的としていません。

于 2010-02-05T15:03:26.977 に答える
0

ソケットのclose()メソッドにより、ソケットが実際に閉じられる前に、write before を使用して送信されたすべてのものが実際に送信されることが保証されます。ただし、これはすべてのデータを tcp スタック出力ウィンドウにコピーできたことを前提としているwrite()ため、常に機能するとは限りません。これに対する解決策については、他の回答を参照してください。

于 2012-01-18T14:34:54.287 に答える