java - Websocket 阻止来自服务器的传入请求

标签 java sockets websocket wamp netty

配置

我有一个使用 websockets 连接到服务器的 java 客户端。我使用 netty 框架作为 websocket 实现。服务器向客户端发送 ping,客户端以 pong 帧响应,否则将导致服务器关闭连接。

场景

我的客户端向服务器发送多个请求并期望得到响应。现在,如果第一个请求的响应很大,那么后续的响应和 ping 都会被阻止,直到客户端完全下载第一个请求。由于 ping 也被阻止,服务器假定连接已断开并强制关闭套接字,然后客户端必须重新连接并再次发送 2 个请求,因为上次响应未完成。

问题

有没有办法让 websocket 以非阻塞方式运行,以便可以处理其他响应/ping?

最佳答案

Is there a way to make the websocket behave in a non-blocking way so that other responses/ping can be handled?

不是真的。 webSocket 底层是一个 TCP 套接字。 TCP 套接字串行发送数据。如果您要发送大量数据,则必须先传输所有数据,然后才能传输其后面的数据包。这就是 TCP 的工作原理。为了解决这个问题,当浏览器想要一次下载多个内容或防止下载一个较大内容干扰其同时执行其他操作的能力时,浏览器会使用多个 TCP 连接。

我认为 webSocket 并不是通过慢速链接发送大型图像文件的理想传输方式 - 特别是当您有 ping 和其他数据时,您希望通过 webSocket 获得一些响应能力。

可能更好的方案是仅通过 webSocket 发送 URL,然后让客户端在收到 URL 时通过不同的 HTTP 请求请求该图像。然后,您仅将 webSocket 用于较小的控制消息,而大数据传输通过并行 HTTP 连接进行,这不会干扰继续使用 webSocket 连接处理其他事务(例如 ping 或其他控制消息)的能力。

而且,您知道 HTTP、浏览器和 Web 服务器已经针对提供图像进行了高度优化(因为这是除视频之外的大部分带宽使用量)。

关于java - Websocket 阻止来自服务器的传入请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37606859/

相关文章:

java - 决定运行时的方法使用。多态性

c - 绑定(bind)无效参数

java - 客户端关闭后保持套接字服务器打开

javascript - socket.io 在发送到特定客户端 Node JavaScript 后断开连接

java - 使用 JPA 创建与实体父类(super class)的关联

java - 在Java中获取驱动器名称

java - 如何在 Objective-C 中将字节数组转换为 UInt64

node.js - node + socketio + express + https 是否也保护套接字数据

jakarta-ee - 在 Tomcat 7 中使用 Web 套接字

sockets - Websocket 或 Http 来开发移动应用程序?