【发布时间】:2016-06-03 05:53:35
【问题描述】:
配置
我有一个使用 websockets 连接到服务器的 java 客户端。我正在使用 netty 框架作为 websocket 实现。服务器向客户端发送ping,客户端以pong帧响应,否则将导致服务器关闭连接。
场景
我的客户端向服务器发送多个请求并期望得到响应。现在如果第一个请求的响应很大,那么后面的响应和 ping 都会被阻塞,直到客户端完全下载第一个请求。由于 ping 也被阻止,服务器假定连接已断开并强制关闭套接字,客户端必须重新连接并再次发送 2 个请求,因为上次响应未完成。
问题
有没有办法使 websocket 以非阻塞方式运行,以便可以处理其他响应/ping?
【问题讨论】:
-
听起来你的 ping 间隔太短了。您发送的消息有多大?发送和接收它们需要多长时间?它是 TCP,因此数据是串行发送的。在发送并确认其前面的大数据之前,实际上不会通过线路发送 ping。如果这需要很长时间,那么您需要放慢速度,不要在之前的大数据仍在发送时立即尝试发送 ping。
-
目前是 90 秒。但这没关系,因为即使我增加它,我也无法控制客户端的下载速度,比如说图像。图片大小也不能控制。
-
那么,可能是你的webSocket库有问题。在发送前一条消息后的某个重要时间之前,它不需要尝试发送 ping。你还希望我们说什么。它不应该在刚刚发送消息后立即发送 ping。只有在发送先前的数据后一段时间不活动后,ping 才会消失,并且该时间需要足够长,以使任何潜在或慢速客户端都能够响应。这就是 ping/pong 系统需要如何工作才能有效且不会出现误报。
-
您要发送多大的图像?我认为您应该向客户端发送一个 URL,并让浏览器使用该 URL 通过 HTTP 请求图像,并从您的 websocket 中获取图像位,从而解决整个问题。 webSocket 并不是真正设计成一个下载系统。虽然可以将它用于很多事情,但它具有优势和不那么优势。较小的有效负载不会干扰同一通道的其他用途并且不会导致 ping 问题,这会好得多。
-
通过 http 下载图片是一个有效的解决方案。客户端可能正在使用不可靠的 2G 移动连接,并且可能会有跨越几千字节 json 的响应。如果连接物理中断,客户端也不会收到其他请求的响应,这将再次重试。
标签: java sockets websocket wamp netty