Tomcat 8.0.x Websockets、SSL 和 Windows --> 最后一帧延迟
Posted
技术标签:
【中文标题】Tomcat 8.0.x Websockets、SSL 和 Windows --> 最后一帧延迟【英文标题】:Tomcat 8.0.x Websockets, SSL and Windows --> last frame delayed 【发布时间】:2015-10-28 13:33:32 【问题描述】:1/ 安装最新版本的 tomcat (8.0.28) 并在 java 8 上运行(我使用的是 1.8.0_45 / 64 位版本)。 我在 Windows 7 64 位上运行 Tomcat
2/ 在 Tomcat 上启用 SSL: 通过创建密钥库并取消注释 server.xml 文件中的 https 连接器来激活 SSL,添加 keystoreFile=""keystorePass="" 到连接器。 仅供参考:这是我的连接器:
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystorePass="password"
keystoreFile="/path/to/my/keystore" />
3/ 安装 Fiddler (www.telerik.com/fiddler) 或任何其他工具来嗅探您的主机和服务器之间的流量,fiddler 应该在您的主机上运行。我用 Fiddler 做了我的屏幕截图。
4/ 转到工具/选项/https并检查“启用解密”。
5/ 使用 Internet explorer 11(chrome 也可以,但由于它会压缩 websocket 流量,因此难以达到 8KB 的数据),使用 https 远程访问您的 tomcat 并在https://server:8443/examples/websocket/echo.xhtml打开示例应用程序
选择“Programmatic API”,点击“Connect”,然后发送一条小测试消息
在 fiddler 上,双击 websocket 会话并在 websocket 选项卡中查看结果。
现在,尝试发送一个 20KB 的大文本,您会看到回复被分割成 8KB 的帧,标记为“继续”。应该有一个标记为“Final”的框架,此时缺少。
发送另一条小消息,以便刷新丢失的帧。
重要:
如果我连接到在我的主机上本地运行的 Tomcat,我不会重现此问题。 如果我不使用 SSL,我不会重现此问题。
问题: - 为什么这样的行为,有没有人经历过同样的事情? - 如何正确解决此问题? - 我尝试启用 Tomcat 日志,但日志中没有任何有趣的内容:org.apache.tomcat.websocket.level = FINE
这个问题显然与操作系统有关: 当 Tomcat 在 Windows 7 上时,它不起作用 当 Tomcat 在 Windows 10 上时,它可以工作 当 Tomcat 在 Windows Server 2012 R2 上时,它可以工作
简而言之,这个问题是 OS(某些版本的 windows)/SSL 和 WebSockets 的组合。
【问题讨论】:
【参考方案1】:我现在发现的“脏”解决方法是发送最后一条消息来刷新缓冲区,因为我可以访问服务器端的代码。
如果您遇到此类问题,请告诉我,因为这可能与某些特定 Windows 版本的 SSL 握手有关,我不知道如何解决。
【讨论】:
以上是关于Tomcat 8.0.x Websockets、SSL 和 Windows --> 最后一帧延迟的主要内容,如果未能解决你的问题,请参考以下文章
在 Tomcat 7 中运行 Java EE 7 WebSockets
本地主机上的 Apache Tomcat websockets 实现
在我的 Tomcat Servlet 中实现 Websockets?