Socket.io重新连接无论我做什么

时间:2017-06-19 01:30:08

标签: javascript socket.io socket.io-1.0

使用socket.io 1.4.5。

无论我做什么,我都无法阻止socket.io触发重新连接事件或在互联网连接中断时销毁客户端套接字。

在客户端,我有:  reconnectionDelay:99999999, 超时:99999999999,             重新连接:false,

然而,如果互联网断开连接,套接字将变为未定义(大约20秒后),并且重新连接事件将在互联网重新启动时触发。

我的最终目标是在服务器和客户端上使用相同的确切套接字(无论它们已经通信多长时间),除非该套接字在服务器上明确断开连接。我无法随意重新连接套接字,因为我将数据存储在套接字上并在我的应用程序中广泛使用socket.id。如果套接字和套接字ID突然改变,应用程序就会中断。

1 个答案:

答案 0 :(得分:1)

我认为你必须在握手时传递一些独特的变量并通过该变量保存数据。 socket.id的重新生成是socket.io的正常行为。

在我的实践中,我正在向服务器发出初始请求以创建slot变量,并在slots中保留mongodb集合,并在我通过定义{{1}创建连接之后变量作为握手。

或者让我们简单回答您的问题并使用:https://www.npmjs.com/package/express-socket.io-session

还有点“黑客”使用命名空间逻辑:https://socket.io/docs/rooms-and-namespaces/#custom-namespaces



奖金:

这是快速解决方案:

客户机侧:

slot

后端:

function genUUID() {
    var d = new Date().getTime();
    var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
        var r = (d + Math.random()*16)%16 | 0;
        d = Math.floor(d/16);
        return (c=='x' ? r : (r&0x3|0x8)).toString(16);
    });
    return uuid;
};

var namespace = localStorage.getItem("namespace");
if(!namespace) {
  namespace = genUUID();
  localStorage.setItem("namespace", namespace);
}

var connect = function (ns) {
    return io.connect(ns, {
       query: 'ns='+ns   // this is handshake variable `ns`
    });
}

var socket = connect('/'+namespace);