2016-08-26 6 views
1

Tomcat 9とSpringを使用しています。Websocket Tomcat 9から2つ以上のtcpパケットに分割されたクライアントへのバイナリメッセージ

私のWebアプリケーションにはwebsocketサービスがあります。

私のアプリケーションはのsendMessageを使用して、クライアントにバイナリメッセージを送信します。

org.springframework.web.socket.WebSocketSession. 

私はwiresharkでTCPパケットを収集しました。すべてのバイナリwebsocketメッセージは、少なくとも2つのTCPパケットを使用することがわかります。

最初のパケットはヘッダーで、小さいです。

Javaコードは常にヘッダーを送信してからデータを残しているようです。

この現象を修正するにはどうすればよいですか? SpringまたはTomcatの問題ですか?

+0

私はこれがTomcatの問題です。 –

答えて

-1

根本的な問題は、Tomcat実装のバグでした。 websocketメッセージのsendメソッドは、メッセージブロックのリストを送信し、各バッファに対してsend()およびflush()を呼び出すことによって繰り返しました。別のバッファにヘッダーをエンコードするとき、ヘッダーとボディは正しいデータグラムでワイヤに書き込まれます。私はこの問題を調べ、追加のメモリ割り当てのために却下したパッチを提出しようとしていることがわかりました。

私は、各ブロックの間ではなく、すべてのブロックが書き込まれた後でflush()を呼び出すだけで、別の修正を提案しました。これにより、追加のメモリ割り当てを追加することなく、メッセージのすべての部分が単一のデータグラムになる可能性があります。私は自分のプロジェクトで修正をテストし、検証しました。そして、Tomcatは次のリリースでそれを採用しました。

修正は8.5.Xおよび9.0に含まれます。この問題を解決するには、tomcatをアップグレードする必要があります。

私はtomcatのgithubでこの問題へのリンクを提供しています。

https://github.com/apache/tomcat85/commit/47c211eb3ee7f9be2df6c313fb65351feabd42d1

関連する問題