处理Websocket的正确方法

Correct way to handle Websocket

本文关键字:方法 Websocket 处理      更新时间:2023-09-26

我有一个客户端到服务器的Websocket连接,它应该在那里40秒左右。理想情况下,它应该永远开放。

客户端不断将数据发送到服务器,反之亦然。

现在我正在使用这个序列:

var socket;
function senddata(data)
{
    if (!socket)
    {
        socket = new WebSocket(url);
        socket.onopen = function (evt) {
            socket.send(data);
            socket.onmessage = function (evt) {
                var obj = JSON.parse(evt.data);
                port.postMessage(obj);
            }
            socket.oneerror = function (evt) {
                socket.close();
                socket = null;
            }
           socket.onclose = function(evt){
               socket = null;
           }

        }
    }
    else
    {
        socket.send(data);
    }
}

显然,根据当前逻辑,如果出现错误,则可能根本不发送当前请求数据。

坦率地说,它有时会给出 websocket 仍处于连接状态的错误。由于网络问题,此连接经常中断。简而言之,它不能很好地工作。

我读过一个更好的设计:如何等待 WebSocket 的 readyState 更改,但并未涵盖我需要处理的所有情况。

我也用谷歌搜索过这个,但无法获得正确的程序。

那么通过Websockets发送常规数据的正确方法是什么,可以很好地处理这些问题,如连接中断等?

您似乎没有涵盖的事件即将发生。这应该工作得很好,因为每当连接终止时都会调用它。这比错误更可靠,因为并非所有连接中断都会导致错误。

我个人使用 Socket.IO,它支持客户端和服务器之间基于事件的实时双向通信。

它是事件驱动的。诸如此类的事件

on connection :: socket.on('conection',callback);

on disconnect :: socket.on('disconnect',callback);

内置 socket.io,因此可以帮助您解决连接问题。非常易于使用,如果您有兴趣,请查看他们的网站。

我在客户端上使用两层方案:抽象包装器 + websocket-client:

websocket-client的职责是与服务器交互,恢复连接并为抽象包装器提供接口(事件发射器和一些方法)。

抽象包装器是一个高级层,当连接暂时失败时,它与 websocket-client 交互,订阅其事件并聚合数据抽象包装器可以为应用层提供任何接口,如 Promise、EventEmitter 等。

在应用程序层,我只使用抽象包装器,而不用担心连接或数据丢失。毫无疑问,在这里提供有关连接状态和数据发送确认的信息是个好主意,因为它很有用。

如有必要,我可以提供一些代码,例如

这显然是服务器问题,而不是客户端的问题。

我不知道这里的服务器是什么样子的。但是,过去当我从事基于websocket的项目时,这对我来说是一个巨大的问题。连接将不断断开。

所以我用java创建了一个websocket服务器,这解决了我的问题。

websockets依赖于很多设置,比如如果你使用servlets,那么servlet container的设置很重要,如果你使用一些php等,apache和php设置很重要,例如,如果你用PHP创建一个websocket服务器,PHP的默认超时为30秒,它将在30秒后中断。如果未设置保持活动状态,则连接将不会保持活动状态等。

作为快速解决方案,您可以做的是

  1. 在一定时间(例如 2 或 3 秒)后继续向服务器发送 ping,以便如果 websocket 断开连接,客户端就会知道它,以便它可以调用 onclose 或 ondisconnect,我希望你知道除了无法发送某些东西之外,没有办法找到连接是否断开。
  2. 检查服务器的保持活动状态标头
  3. 如果您有权访问服务器,则为超时等。

我认为这会有所帮助