1

クライアントからデータを読み取るために、ソケットチャネルと NIO の概念を使用しています。
ファイルの読み取りが完了したことをソケット チャネルはどのように認識しますか?

ByteBuffer byteBuffer = ByteBuffer.allocate(BUFSIZE);
int nbytes = socketChannel.getChannel().read(byteBuffer);

データが小さい場合は一度にデータを読み取っていますが、データが大きい場合は、データを断片的に読み取って最終的に同じデータを取得します。チャネルがデータの終わりをどのように理解しているかを知りたいです。
ファイルの読み込みがいつ完了したかを知る方法はありますか?

4

1 に答える 1

4

次の 3 つの基本的なオプションがあります。

  • プロトコルは、ファイルの長さがデータの前に来るように指定できます。
  • プロトコルは、いくつかの「ファイルの終わり」マーカーを指定できます (もちろん、ファイル内のデータに対して無効である必要があります)。
  • サーバーは終了時にソケットを閉じることができます。read呼び出しは -1 を返し、すべてのデータが読み取られたことを知らせます。

基本的に、データがストリーミングされる方法では、特定の数のリクエストですべてのデータが送信されることに依存することはできません。

使用しているプロトコルは何ですか?適切に変更できますか? 通常、長さの接頭辞が最も簡単な解決策です。

于 2009-05-15T13:59:04.677 に答える