3

私はクライアント サーバー アプリケーションを開発しており、websocket で実行するためのサポートを追加する任務を負っています。サーバー側でCowboyを使用しており、テストのためにErlang Websocketクライアントに取り組んでいます。

物事は次のようになるはずです:

  1. クライアントはソケット接続を開き、http ハンドシェイクを開始します
  2. サーバーは http ハンドシェイクを完了します
  3. クライアントはサーバーにメッセージを送信し、サーバーは応答を送信します
  4. クライアントが応答を処理する
  5. 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) です

それが関連しているかどうかはわかりません。

4

1 に答える 1

5

TCP にはメッセージ境界がありません。あなたが期待している行動に頼る権利はありません。トランスポートは、正しい順序ですべてを無傷で提供する限り、任意の断片でデータを提供できます。TCP はバイト ストリームを提供し、ほとんどの SSL ライブラリも同様です (ただし、下位レベルには実際に SSL レコード メッセージがあります)。

于 2012-06-12T01:16:05.393 に答える