Я обнаружил, что WebSockets в Chrome и Firefox отключается через ровно одну минуту бездействия. Основываясь на материалах, которые я видел в Интернете, я был настроен обвинять прокси или некоторые настройки сервера или что-то в этом роде, но этого не происходит в IE или Edge. Кажется, если сокеты отключены сервером после одной минуты бездействия, которые будут применяться к IE и Edge так же, как Chrome и Firefox.
Кто-нибудь знает, почему это? Документировано ли это где угодно? Я знаю возможный способ остановить это, пинговая, но меня больше интересует, почему это происходит. Код причины, указанный при отключении, равен 1006, что указывает на то, что браузер закрыл соединение. Ошибок не возникает, и событие onerror для сокета не запускается.
Этот проект был построен по адресу https://glitch.com/edit/#!/noiseless-helmet, где вы можете видеть и запускать все. Страница клиента обслуживается здесь: 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);
});