处理Websocket的正确方法

时间:2016-01-26 10:05:36

标签: javascript websocket

我是服务器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仍然处于连接状态的错误。由于网络问题,此连接经常中断。简而言之,它不能很好地运作。

我已经阅读了更好的设计:How to wait for a WebSocket's readyState to change但并未涵盖我需要处理的所有情况。

此外,我已经用Google搜索了相关内容,但无法获得正确的程序。

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

4 个答案:

答案 0 :(得分:2)

您似乎无法涵盖的事件是关闭的。哪个应该工作得很好,因为只要连接终止就会调用它。这比onerror更可靠,因为并非所有连接中断都会导致错误。

答案 1 :(得分:1)

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

这是事件驱动的。诸如

之类的活动

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

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

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

答案 2 :(得分:1)

我在客户端使用双层方案:abstract-wrapper + websocket-client:

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

abstract-wrapper 是一个高级层,当连接暂时失败时,它与websocket-client交互,订阅其事件和聚合数据 abstract-wrapper 可以向应用层提供任何接口,如Promise,EventEmitter等。

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

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

答案 3 :(得分:0)

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

我不知道服务器在这里的样子。但是,当我在基于websocket的项目上工作时,这对我来说是一个巨大的问题。连接会不断中断。

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

websockets取决于很多设置,比如你是否使用servlet然后servlet容器的设置很重要,如果你使用某些php等,apache和php设置很重要,例如你在php中创建一个websocket服务器,php的默认超时时间为30秒,30秒后就会中断。如果未设置keep-alive,则连接不会保持活动状态等。

快速解决方案可以做什么

  1. 在一段时间后继续向服务器发送ping(比如2或3秒,这样如果websocket断开连接,则客户端知道它可以调用onclose或ondisconnect,我希望你知道有除了没有发送东西之外,无法找到连接是否被破坏。
  2. 检查服务器的keep-alive header
  3. 如果您有权访问服务器,那么它的超时等等。
  4. 我认为这会有所帮助