Как ранее писал Димитар, вы можете использовать socket.io для отправки сообщений с сервера клиенту и наоборот. Это можно сделать так же просто:
//Server sent message:
io.on('connection', (socket) => {
socket.emit('notificationToClient', 'Message'); //message sent from server to client
});
});
//Client receives the message:
const socket = io.connect('http://localhost:3000');
socket.on('notificationToClient', (data) => { //received message
console.log(data);
});
API websocket немного менее запутан, чем socket.io, но IMO, я бы go с socket.io, поскольку он уже имеет дело с большим количеством тяжелой работы, такой как повторное подключение, пользовательские пространства имен, комнаты и т. д. c. На socket.io есть несколько курсов fantasti c udemy.
См. Документацию по socket.io здесь: https://socket.io/docs/
Обновление от 9.05.2020:
Мишель - Поскольку вы спросили, как реализовать Socket.io в вашем коде, я дам вам пример того, как я реализовал эту технологию в своем последнем проекте. Я работал над веб-приложением, которое подключается к системам сигнализации ELK и может ставить / снимать эти системы с охраны, а также получать входные сигналы датчиков (звуковые сигналы) в любом удаленном месте. Размер бэкэнда - Node.js, а пользовательского интерфейса - React.
//client side code
import React, { Component, Suspense } from 'react';
import panels from "./panels.js"
const socketConnection = io("http://localhost:5000"); //Socket.io
function App() {
function handleClick(panel) {
socketConnection.emit("panelData", panel); //Socket.io - sends the connection data for the ELK alarm panel to the express server
socketConnection.on('data', (data) => { //Socket.io - receives data from the server.
//does something with the data
})
}
}
//server side code
const express = require('express');
const elkClient = require('elk-client');
const app = express();
const server = app.listen('5000', () => {
console.log('------Server Running on 5000---------');
});
let io = new sio(server);
io.on("connection", (socket) => { //boilerplate code - establishes the "handshake" with the client.
socket.on("panelData", async (msg) => { //receives the ELK connection parameters from the client. See client side code
const client = new ElkClient({
connection: {
site: msg.name,
host: msg.host,
}
})
await client.connect();
client.on("message", (elkMessage) => { // This is NOT Socket.io - server is listening for emitted data from the alarm system - beam breaks, alarms, arm/disarm etc. [See event emitter][2]
if(elkMessage.messageType == 'A' && elkMessage.subMessageType == 'S') {
const armingStatusReport = {elkMessage};
socket.emit("data", armingStatusReport); //Socket.io - emits the received data to the client.
}
})
Я попытался упростить приведенный выше код, чтобы попасть в точку. Сервер использует параметры подключения, которые он получает от клиента, для подключения к удаленной системе охранной сигнализации. Затем сервер ожидает и прослушивает входящие данные с помощью client.on () (эмиттер событий, а не socket.io). По мере получения данных я использую Socket.io для отправки полученных данных обратно клиенту с помощью socket.emit (); Из-за того, как работают системы сигнализации, данные отправляются на основе событий, поэтому api выборки не соответствует требованиям, в отличие от socket.io (или веб-сокетов).
Сообщите мне, могу ли я помочь с что-нибудь еще. В этом недавнем проекте я потратил последние несколько месяцев НАСИЛЬНО, работая с socket.io, включая пространства имен, комнаты и т. Д. c. Мне также пришлось создать приложение для мониторинга в реальном времени для управления производительностью моего сервера с использованием socket.io, поскольку я реализовал кластеризацию. Не стесняйтесь обращаться ко мне в любое время!