gpt4 book ai didi

java - 从 Tomcat 9 到客户端的 Websocket 二进制消息拆分为 2 个或更多 tcp 数据包

转载 作者:行者123 更新时间:2023-11-28 22:33:43 24 4
gpt4 key购买 nike

我正在使用 Tomcat 9 和 Spring。

我的网络应用程序有一个 websocket 服务。

我的应用程序使用 sendMessage 向客户端发送二进制消息:

org.springframework.web.socket.WebSocketSession.

我通过 wireshark 收集了 tcp 数据包.我看到每个二进制 websocket 消息至少使用 2 个 TCP 数据包。

第一个包是包头,很小。

Java 代码似乎总是发送 header ,然后发送其余数据。

如何解决这个问题?是 Spring 还是 Tomcat 的问题?

最佳答案

根本问题是 tomcat 实现中的错误。他们用于 websocket 消息的 send 方法获取要发送的消息 block 列表,并遍历它们为每个缓冲区调用 send() 和 flush() 。当它们在单独的缓冲区中对 header 进行编码时, header 和正文将因此以您正确识别的方式写入不同数据报中的线路。我调查了这个问题,发现您曾尝试向他们提交补丁,但由于额外的内存分配,他们拒绝了。

我对它们提出了另一种修复方法,即在写入所有 block 后调用 flush() 一次,而不是在每个 block 之间调用一次。这会导致消息的所有部分在可能的情况下进入单个数据报,而无需添加任何额外的内存分配。我在我的项目中测试并验证了该修复程序,并且 tomcat 已将其用于他们的下一个版本。

修复将包含在 8.5.X 和 9.0 中。您必须升级 tomcat 才能解决此问题。

我在 tomcat 的 github 中提供了该问题的链接以供引用。

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

关于java - 从 Tomcat 9 到客户端的 Websocket 二进制消息拆分为 2 个或更多 tcp 数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39164768/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com