我发现 Chrome 和 Firefox 中的 WebSocket 在闲置一分钟后就会断开连接。根据我在网上看到的内容,我完全将责任归咎于代理或某些服务器设置或其他东西,但在 IE 或 Edge 中不会发生这种情况。看起来如果套接字在一分钟不活动后被服务器断开连接,这将适用于 IE 和 Edge,就像 Chrome 和 Firefox 一样。
有人知道为什么吗?它在任何地方都有记录吗?我知道一种可能的方法是通过 ping 来阻止它,但我更感兴趣的是为什么会发生这种情况。断开连接时给出的原因代码是 1006,表明浏览器关闭了连接。不会引发任何错误,也不会触发套接字的 onerror 事件。
该项目建于https://glitch.com/edit/#!/noiseless-helmet https://glitch.com/edit/#!/noiseless-helmet您可以在其中查看并运行所有内容。客户端页面在这里提供:https://noiseless-helmet.glitch.me/ https://noiseless-helmet.glitch.me/
这是我的客户页面:
<div id="div">
</div>
<script>
let socket = new WebSocket("wss://noiseless-helmet.glitch.me/");
socket.onmessage = function(event) {
div.innerHTML += "<br>message " + new Date().toLocaleString() + " " + event.data;
};
socket.onopen = function (event) {
div.innerHTML += "<br>opened " + new Date().toLocaleString();
socket.send("Hey socket! " + new Date().toLocaleString());
};
socket.onclose = function(event) {
div.innerHTML += "<br>socket closed " + new Date().toLocaleString();
div.innerHTML += "<br>code: " + event.code;
div.innerHTML += "<br>reason: " + event.reason;
div.innerHTML += "<br>clean: " + event.wasClean;
};
socket.onerror = function(event) {
div.innerHTML += "<br>error: " + event.error;
};
</script>
这是我的 Node.js 服务器代码:
var express = require('express');
var app = express();
app.use(express.static('public'));
let server = require('http').createServer(),
WebSocketServer = require('ws').Server,
wss = new WebSocketServer({ server: server });
app.get("/", function (request, response) {
response.sendFile(__dirname + '/views/index.html');
});
let webSockets = [];
wss.on('connection', function connection(socket) {
webSockets.push(socket);
webSockets.forEach((w) => { w.send("A new socket connected"); });
socket.on('close', (code, reason) => {
console.log('closing socket');
console.log(code);
console.log(reason);
let i = webSockets.indexOf(socket);
webSockets.splice(i, 1);
});
});
server.on('request', app);
server.listen(process.env.PORT, function () {
console.log('Your app is listening on port ' + server.address().port);
});