Использование websockets напрямую может быть проблематичным, рекомендуется использовать каркас для абстрагирования этого слоя, чтобы они могли легко переходить к другим методам, когда они не поддерживаются в клиенте.Например, это прямая реализация, использующая Express js и Websockets напрямую.Этот пример также позволяет вам использовать тот же сервер для HTTP-вызовов.
const express = require('express');
const http = require('http');
const WebSocket = require('ws');
const app = express();
//initialize a simple http server
const server = http.createServer(app);
//initialize the WebSocket server instance
const wss = new WebSocket.Server({ server });
wss.on('connection', (ws) => {
//connection is up, let's add a simple simple event
ws.on('message', (message) => {
//log the received message and send it back to the client
console.log('received: %s', message);
ws.send(`Hello, you sent -> ${message}`);
});
//send immediatly a feedback to the incoming connection
ws.send('Hi there, I am a WebSocket server');
});
//start our server
server.listen(3000, () => {
console.log(`Server started on port ${server.address().port} :)`);
});
Для клиента вы можете сделать что-то вроде этого:
const ws = new WebSocket('ws://localhost:3000')
ws.onopen = () => {
console.log('ws opened on browser')
ws.send('hello world')
}
ws.onmessage = (message) => {
console.log(`message received`, message.data)
}
Как я уже говорил выше, этоРекомендуется использовать зрелый фреймворк для веб-сокетов .Если ваше приложение минимально и не требует масштабирования, вы можете использовать любую библиотеку с открытым исходным кодом, наиболее популярной является socket.io .
Однако, если вы говорите о реализации этой возможности,При использовании на производственном уровне вы должны знать, что решения с открытым исходным кодом не допускают масштабируемости, отработки отказа, упорядочения сообщений и т. д. В этом случае вам придется реализовать платформу реального времени в качестве инструмента обслуживания. Сеть потоков данных Ably - одно из таких решений, которое я лично использовал для многих своих проектов.