私はクライアント サーバー アプリケーションを開発しており、websocket で実行するためのサポートを追加する任務を負っています。サーバー側でCowboyを使用しており、テストのためにErlang Websocketクライアントに取り組んでいます。
物事は次のようになるはずです:
- クライアントはソケット接続を開き、http ハンドシェイクを開始します
- サーバーは http ハンドシェイクを完了します
- クライアントはサーバーにメッセージを送信し、サーバーは応答を送信します
- クライアントが応答を処理する
- 3と4を繰り返す
クライアントモジュールは実装します
handle_info({Transport, Socket, Data}, StateName, State) ->
... do stuff with data ...
これは、データが表示されたときに、基礎となるトランスポート (gen_tcp または ssl) によって呼び出されます。
を使用するようにクライアントとサーバーを構成すると、すべて正常に動作しますgen_tcp
。代わりに を使用するssl
と、websocket ハンドシェイクが完了しますが、ステップ 4 でhandle_info
、サーバーから返されたデータの最初のバイトのみを含む へのコールバックを取得しています。後続のコールバックには、残りの応答が含まれます。
gen_tcp をスワップインした同じコードが正常に動作し、ssl
(websocket やカウボーイではなく) を使用して構築された他の 2 つのトランスポートが同様にこの動作を示さないことを考えると、この動作に本当に混乱しています。
データがこのように分割される原因を誰かが示唆できますか? 必要がなければ、この処理を記述する必要はありません。
更新:キックのために、クライアントを修正して、2 つのコールバックが発生するのを待機し、解析を試みる前に両方からのデータを連結するようにしました。これで問題は解決しますが、まだ困惑しています。
ただし、いくつかのことに気付きました。
- 2 つのコールバックの最初のセットには、常に正確に 1 バイトが含まれます。
- そのバイトは常に 130 (0x82) です
それが関連しているかどうかはわかりません。