0

PythonのBaseHTTPRequestHandlerクラスを使用してWebサーバーを構築しています。WebSocketのエンドポイントを追加したい。これは、ハンドラーのrfileから利用可能なものをすべて読み取る必要があることを意味します。これにより、メッセージを受信したときに(while入力を読み取る代わりに)メッセージを1つずつ処理できます。

「読み取り」のさまざまな組み合わせを使用してみました(たとえば、大きなバッファを使用して、使用可能なデータが少ない場合はデータが少なくなると早期に返されると考えています。パラメータはありませんが、EOFまで読み取ることを意味します)ができませんでした。これを機能させる。

私は2つの解決策を考えることができます:

  • read(1)を呼び出すには:バイトを1つずつ読み取ります。バッファリングのセマンティクスが何であるかわからないため、これは行いたくありません(たとえば、バイトごとのシステムコールの読み取りは必要ありません)。

  • ファイルを一時的に非ブロックにするには、データのチャンクの読み取りを試行し、次にブロックに設定してから、1バイトの読み取りを試行します。これはかなり厄介なようです。私が考えることができるもう1つのオプションは、非ブロッキングソケットを使用することですが、これは現在のスレッド化されたフレームワークではうまく機能しないようです。

利用可能なデータを返すために読み取る方法についてのアイデアはありますか?

4

1 に答える 1

1

WebSocket は HTTP ではないため、HTTP 要求ハンドラーで実際に処理することはできません。

ただし、HTTP で BaseHTTPRequestHandler を使用すると、通常、期待する正確な量のデータのみを読み取ることになります (たとえば、Content-length ヘッダーで指定されているように)。

于 2013-02-23T03:00:42.817 に答える