WebSockets
WebSocket'ы на express https://hackernoon.com/nodejs-web-socket-example-tutorial-send-message-connect-express-set-up-easy-step-30347a2c5535
npm i express ws
Создаем app.js
var express = require('express')
var ws = require('./ws')
var app = express()
app.get('/', function (req, res) {
res.sendfile(__dirname + '/ws.html');
})
app.listen(3000, function () {
console.log('Example app listening on port 3000!')
})
Создаем ws.js, который будет отвечать за WebSocket'ы
var WebSocketServer = require('ws').Server,
wss = new WebSocketServer({port: 40510})
wss.on('connection', function (ws) {
ws.on('message', function (message) {
console.log('received: %s', message)
})
setInterval(
() => ws.send(`${new Date()}`),
1000
)
})
Клиентская часть будет представлена ws.html
<script>
var ws = new WebSocket('ws://localhost:40510');
// event emmited when connected
ws.onopen = function () {
console.log('websocket is connected ...')
// sending a send event to websocket server
ws.send('connected')
}
// event emmited when receiving message
ws.onmessage = function (ev) {
console.log(ev);
}
</script>
Запускаем app.js и открываем консоль браузера. Если всё прошло успешно, то мы должны увидеть как у нас появляются новые сообщения со временем и датой.
Поиск и удаление отвалившихся соединений
Идея состоит в том, что мы отмечаем все сообщения как отвалившиеся(isFalse=false), а потом посылаем ping сообщение на клиент через ws.ping .
Для тех соединений, которые ответили нам сообщением pong, мы восстанавливаем isAlive в true, через сообщение heartBeat
const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
function noop() {}
function heartbeat() {
this.isAlive = true;
}
wss.on('connection', function connection(ws) {
ws.isAlive = true;
ws.on('pong', heartbeat);
});
const interval = setInterval(function ping() {
wss.clients.forEach(function each(ws) {
if (ws.isAlive === false) return ws.terminate();
ws.isAlive = false;
ws.ping(noop);
});
}, 30000);
Полезное чтиво:
О протоколе WebSockets и сравнение c http2 https://habr.com/company/ruvds/blog/342346/
Подробнее о модуле ws https://www.npmjs.com/package/ws
http://stackabuse.com/node-js-websocket-examples-with-socket-io/
Написание клиентских приложений с помощью WebSocket'ов https://developer.mozilla.org/ru/docs/WebSockets/Writing_WebSocket_client_applications
Практика:
На клиентской стороне создаем кнопку, на которую можно кликать. Отображаем на ней общее количество кликов от всех пользователей.
Создаем чат, использующий WebSockets
Добавляем в чат, чтобы каждый пользователь отображался под своим ником
Показываем сколько пользователей у нас в чате