Websockets クライアントとサーバーを作成しようとしています。最初の接続は HTTP であり、Websockets ハンドシェイクは HTTP ヘッダーを使用して、接続で新しいプロトコルへのアップグレードが必要であることを示します。
SocketChannel から HTTP ヘッダーのセットを読み込み、アップグレードが示されている場合は、Websocket を処理する別のライブラリに切り替え、その時点から SocketChannel ストリームをまったく異なる方法で処理します (行ではなくフレームのセットとして)。 \r\n で区切ります。
任意のバイト数を ByteBuffer に読み込むことができることはわかっていますが、ハンドシェイクで Websockets フレームが送信された可能性があり、これらのコード セクション間で半分消費されたバッファーを渡したくありません。私が望むのは、シーケンス「\r\n\r\n」までのデータのみをソケットから読み取ることです。それを超えるデータは、SocketChannel オブジェクトの入力ストリームに残しておきます。
これを行うための推奨される方法は何ですか? SocketChannel から入力ストリームを取得し、バッファリングされたリーダーでラップしますか? これは、NIO、特にノンブロッキングの使用と適切に相互作用しますか? 空白行が検出されたら、バッファリングされたリーダーを入力ストリームから削除し、チャネルが Websockets コードに渡されたときにすべてのフレーム データを利用できるようにすることはできますか?
または、バイトごとに (または、ターゲットの "\r\n\r\n" 文字の一部がチャンクの最後に表示される場合は、バッファーが小さい 4 バイトのチャンク) を読み取り、ヘッダー文字列を構築する必要があるかもしれません。仕方。
あるいは、バッファが直接割り当てられていれば、mark、limit、および position の操作の組み合わせによって、入力ストリームが以前に ByteBuffer に読み取ったデータを取り戻すことができるかもしれません。
アドバイスをいただければ幸いです。