Javascript 铬';s onmessage()在重新连接后不会立即触发,尽管从服务器收到消息
我目前正在尝试在chrome和NodeJS服务器之间创建websocket。 节点服务器使用插件,我使用Chrome的默认websocket处理程序 以下是我的服务器代码行: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)); }); 以及我的客户
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)。这在性能方面会更好,因为您不必每次都执行相同的检查。