通过 http 将文件下载到同一主机时 Websocket 阻塞

Posted

技术标签:

【中文标题】通过 http 将文件下载到同一主机时 Websocket 阻塞【英文标题】:Websocket blocks when downloading file via http to the same host 【发布时间】:2014-07-17 17:06:19 【问题描述】:

我有一个运行 Java Play Framework 2.2.1 的服务器和一个客户端应用程序,它通过 websockets 连接到服务器以通过 http 监视和下载文件。我在下载大文件时遇到问题,websockets 消息会阻塞,直到下载在连接的客户端结束。客户端使用 Java JDK8 和用于 websockets 的 Tyrus 库。

有人知道 HTTP 和 Websockets 之间是否有任何优先级(据我所知,Websockets 是通过 HTTP 包实现的)?

【问题讨论】:

【参考方案1】:

通过请求升级到 Websocket protocol 来启动客户端和服务器之间的 HTTP 连接完成初始引导后,客户端和服务器之间就不再有 HTTP。

WebSocket 是 TCP 上的传输层。与 HTTP 不同,它允许通过 TCP 连接进行全双工通信。

【讨论】:

感谢您的回答。但是,在调度包时,HTTP 和 Websockets 的优先级相同吗?因为这只是意味着连接是由 HTTP 建立的,但在这之后所有的握手都是由普通的 TCP 套接字完成的? 是的,初始连接是 HTTP。 Websocket 握手被称为服务器验证升级的初始过程。之后,它的 Websocket over TCP。 websocket.org/aboutwebsocket.html 好的。感谢您对 Web 套接字的解释,但在文件下载完成之前,我无法理解为什么 websockets 会被阻止。然后所有入队的字节都被发送和接收,没有任何问题。【参考方案2】:

问题是 Tyrus 库的处理程序阻止了 Websocket 的任何其他操作。因此,我们只需在接收处理程序中启动一个新的 java 线程,并尽可能快地离开这个线程。

感谢之前的建议。

【讨论】:

以上是关于通过 http 将文件下载到同一主机时 Websocket 阻塞的主要内容,如果未能解决你的问题,请参考以下文章

在okhttp中使用http2时,为啥对同一主机的多个请求不只使用一个connectoin

snmptrapd 无法将接收到的陷阱转发到同一主机上的不同端口

xampp从连接在同一网络中的不同系统将数据发送到MySQL db到本地主机[重复]

Apache多站点的配置

HTTP Keep-Alive 到不同的主机

Tomcat虚拟主机