Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 无论我做什么,Socket.io重新连接都会触发_Javascript_Socket.io_Socket.io 1.0 - Fatal编程技术网

Javascript 无论我做什么,Socket.io重新连接都会触发

Javascript 无论我做什么,Socket.io重新连接都会触发,javascript,socket.io,socket.io-1.0,Javascript,Socket.io,Socket.io 1.0,使用socket.io 1.4.5 似乎无论我做什么,我都无法阻止socket.io在internet连接中断时触发重新连接事件或破坏客户端套接字 在客户方面,我有: 重新连接延迟:9999999, 超时:9999999999, 重新连接:错误 然而,如果互联网断开连接,套接字将变得未定义(大约20秒后),当互联网重新打开时,重新连接事件将触发 我的最终目标是在服务器和客户机上使用相同的套接字(无论他们通信多久),除非该套接字在服务器上显式断开连接。我不能随意让套接字重新连接,因为我在套接字上存

使用socket.io 1.4.5

似乎无论我做什么,我都无法阻止socket.io在internet连接中断时触发重新连接事件或破坏客户端套接字

在客户方面,我有: 重新连接延迟:9999999, 超时:9999999999, 重新连接:错误

然而,如果互联网断开连接,套接字将变得未定义(大约20秒后),当互联网重新打开时,重新连接事件将触发


我的最终目标是在服务器和客户机上使用相同的套接字(无论他们通信多久),除非该套接字在服务器上显式断开连接。我不能随意让套接字重新连接,因为我在套接字上存储数据,并在应用程序中广泛使用socket.id。如果套接字和套接字id突然改变,应用程序就会中断

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

在我的实践中,我向服务器发出了创建
slot
变量的初始请求,并将其保存在
mongodb
中的
slot
集合中,然后通过将
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);
后端:

const 
  url = require('url'),
  sharedData = {};

io.sockets.on('connection', (socket) => {
  const handshake = url.parse(socket.handshake.url, true);
  const ns = handshake.query ? handshake.query.ns : 'default';
  console.log('GOT CONNECTION TO NS: '+ns);

  io.of(ns).on('connection', (socket) => {
    if(!sharedData[ns]) sharedData[ns] = {};
    // put socket code here
    socket.on('some-event', (data) => {
      sharedData[ns]['some-event'] = data.someData;
    });
  });
});

不幸的是,我的整个客户端和服务器应用程序都是使用socket.id作为唯一标识符构建的。重写这将是一次痛苦的经历。当然,即使在重新连接之后,也必须有某种方法在客户端和服务器上保留原始套接字。重写你的代码,2。重写socket.io-client的代码。选一个(:你能解释一下你链接到的东西吗?产品页面上没有说明,只有安装说明。我假设这是套接字的某种会话处理程序?这将如何帮助保留我的套接字?我给你的链接底部有一个握手示例。它简化了创建和处理
s的过程lot
变量,我通过保持会话上下文手动使用。我不是在寻找示例。我是在寻找有关此项目的功能和用途的简要概述或说明。听起来您希望在套接字连接时使用基于cookie的客户端会话,而不是尝试创建永久套接字对象。然后,存储e会话中的信息,您可以随时从该客户端连接到新的套接字连接。