Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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 铬';s onmessage()在重新连接后不会立即触发,尽管从服务器收到消息_Javascript_Node.js_Google Chrome_Websocket - Fatal编程技术网

Javascript 铬';s onmessage()在重新连接后不会立即触发,尽管从服务器收到消息

Javascript 铬';s onmessage()在重新连接后不会立即触发,尽管从服务器收到消息,javascript,node.js,google-chrome,websocket,Javascript,Node.js,Google Chrome,Websocket,我目前正在尝试在chrome和NodeJS服务器之间创建websocket。 节点服务器使用插件,我使用Chrome的默认websocket处理程序 以下是我的服务器代码行: wss.on('connection', function connection(ws) { ws.id = uuid(); let response = {'type': 'uuid','data': ws.id}; ws.send(JSON.stringify(response)); }); 以及我的客户

我目前正在尝试在chrome和NodeJS服务器之间创建websocket。 节点服务器使用插件,我使用Chrome的默认websocket处理程序

以下是我的服务器代码行:

wss.on('connection', function connection(ws) {
  ws.id = uuid();
  let response = {'type': 'uuid','data': ws.id};
  ws.send(JSON.stringify(response));
});
以及我的客户代码:

//Listens for new messages
connection.onmessage = function(e) {
  let data = JSON.parse(e.data);
  console.log(data.data);
}
我期望的是:每次创建连接时,服务器都会为客户端生成UUID,客户端会将其打印到控制台。当连接断开且客户端重新连接时,服务器将向客户端发送新的UUID

发生的情况:服务器在创建连接时为客户端生成UUID,客户端将其打印到控制台。然而,当服务器停机并恢复时,客户端重新建立连接,服务器确实会向客户端发送一个新的UUID,但chrome没有接收到它

任何帮助都将不胜感激。谢谢

编辑:这是我重新连接到服务器的方式

//Reconnect to server
setInterval(function() {
  if (connection.readyState !== WebSocket.OPEN) {
    reconnect = false;
    connection.close();
    console.log("Disconnected from server. Retrying...");
    connection = new WebSocket(server);
  } else {
    if (!reconnect) {
        reconnect = true;
        console.log("Reconnected to server.");
    }
  }
}, 1000);
编辑2:修改了代码,仍然不起作用:

//Webhook
//On connection open
connection.onopen = function() {
  console.log("Connected to server");
  reconnect = "";
  //Reconnect to server if disconnected
  connection.onclose = function(e) {
    console.log("Connection closed, reconnecting...");
    //Retry every second
    reconnect = setInterval(function() {
        if (connection.readyState !== WebSocket.OPEN) {
            connection.close();
            console.log("Connecting to server...");
            connection = new WebSocket(server);
        }
    }, 1000);
  }
}

onopen()
也不会在重新连接时触发,因此客户端会在断开连接后每秒尝试重新连接,并且不会停止。

我找到了一个解决方案

//Webhook
function connect() {
  //Attempt to connect to server
  if (firstConnect) {
    console.log("Connecting to server...");
    connection = new WebSocket(server);
  } else {
    if (connection.readyState !== WebSocket.OPEN) {
      connection.close();
      console.log("Connecting to server...");
      connection = new WebSocket(server);
    }
  }

  //On connection open
  connection.onopen = function() {
    firstConnect = false;
    console.log("Connected to server");
    clearInterval(reconnect);
  }

  //Listens for new messages
  connection.onmessage = function(e) {

 }

   //Reconnect to server if disconnected
   connection.onclose = function(e) {
    console.log("Connection closed, reconnecting...");
    connect();
  }
}
当您创建一个新的套接字连接时,chrome会反复尝试自己连接,直到超时。超时将触发
connection.onclose
,它依次调用
connect()

通过将其全部嵌套在
connect()
中,事件处理程序每次都会连接到新的websocket连接上。此外,您不需要
setInterval()
,从而避免了任何性能问题


测试浏览器:Chrome、Opera、Safari

如果客户端重新连接到服务器,是否确定在新连接上设置了
onmessage
侦听器?你能在你的问题中包括你的重新连接处理吗?意识到我会在一段时间内回复你@Seblor@Seblor我该怎么做呢?我是否将
onmessage
包装成
onopen
?我在上面的主要问题中添加了重新连接的方式。当websocket打开其连接时,您应该初始化所有侦听器。此外,您可以将侦听器添加到服务器关闭(或崩溃)时将触发的
onclose
事件中,而不是使用setInterval检查连接是否仍处于活动状态,然后尝试重新连接(如果您想在第一次失败的情况下进行多次尝试,可以使用setinterval)。这在性能方面会更好,因为您不必每次都执行相同的检查。