0

私のシステムは、SocketChannel を介して 0x0D 0x0A で終了する UTF-8 行を受信して​​います。次のように ByteBuffer でデータを読み取ります。

final ByteBuffer buffer = ByteBuffer.allocate(bufsize);
final int bytesRead = _mySocket.read(buffer);

バッファーは、多くの行を含めるのに十分な大きさです。しかし、すべての行を含めるのに十分な大きさのバッファーを持つことはできません。行はその場で処理されます。

バッファーにすべての行を含めることはできないため、行が分割される可能性があり、1 バイト以上でエンコードされた文字も分割される可能性があります。

私は解決策について考えました:

  1. ByteBuffer をバイト単位で分析して抽出できるすべての行を処理します (0x0D 0x0A を検索します)。
  2. 未処理のバイトを特定する
  3. それらを一時変数に格納します
  4. ByteBuffer をクリアする
  5. 未処理のバイトを ByteBuffer に追加します
  6. SocketChannel を再度読み取ります。
  7. すべての行を受信したことを示す行が見つかるまで、これを繰り返します。

Java やその他のライブラリはすでにこの機能を提供していますか?

答えてくれてありがとう、ミカエル

4

1 に答える 1

0

java.util.Scanner を使用することをお勧めします。これは、SocketChannel の処理方法と行の読み取り方法を知っています。

    Scanner sc = new Scanner(_mySocket);
于 2012-12-10T02:14:21.587 に答える