Najprostsze, najbardziej eleganckie rozwiązanie
To tak proste jak:
client.emit("your message");
I to wszystko.
Ale jak? Daj mi przykład
To, czego wszyscy potrzebujemy, to w rzeczywistości pełny przykład i oto co następuje. Jest to testowane z najnowszą wersją socket.io (2.0.3), a także korzysta z nowoczesnego Javascript (z którego wszyscy powinniśmy teraz korzystać).
Przykład składa się z dwóch części: serwera i klienta. Za każdym razem, gdy klient łączy się, zaczyna otrzymywać od serwera okresowy numer sekwencyjny. Dla każdego nowego klienta uruchamiana jest nowa sekwencja, więc serwer musi śledzić ich indywidualnie. Właśnie wtedy pojawia się „Muszę wysłać wiadomość do konkretnego klienta” . Kod jest bardzo prosty do zrozumienia. Zobaczmy.
serwer
server.js
const
io = require("socket.io"),
server = io.listen(8000);
let
sequenceNumberByClient = new Map();
// event fired every time a new client connects:
server.on("connection", (socket) => {
console.info(`Client connected [id=${socket.id}]`);
// initialize this client's sequence number
sequenceNumberByClient.set(socket, 1);
// when socket disconnects, remove it from the list:
socket.on("disconnect", () => {
sequenceNumberByClient.delete(socket);
console.info(`Client gone [id=${socket.id}]`);
});
});
// sends each client its current sequence number
setInterval(() => {
for (const [client, sequenceNumber] of sequenceNumberByClient.entries()) {
client.emit("seq-num", sequenceNumber);
sequenceNumberByClient.set(client, sequenceNumber + 1);
}
}, 1000);
Serwer zaczyna nasłuchiwać na porcie 8000 dla połączeń przychodzących. Kiedy ktoś przybywa, dodaje nowego klienta do mapy, aby mógł śledzić swój numer sekwencyjny. Nasłuchuje również disconnect
zdarzenia tego klienta , kiedy usunie je z mapy.
Co sekundę uruchamiany jest stoper. Kiedy to nastąpi, serwer przechodzi przez mapę i wysyła wiadomość do każdego klienta z bieżącym numerem sekwencyjnym. Następnie zwiększa ją i zapisuje z powrotem na mapie. To wszystko. Bułka z masłem.
Klient
Część klienta jest jeszcze prostsza. Po prostu łączy się z serwerem i nasłuchuje seq-num
wiadomości, drukując ją na konsoli za każdym razem, gdy przybywa.
client.js
const
io = require("socket.io-client"),
ioClient = io.connect("http://localhost:8000");
ioClient.on("seq-num", (msg) => console.info(msg));
Uruchamianie przykładu
Zainstaluj wymagane biblioteki:
npm install socket.io
npm install socket.io-client
Uruchom serwer:
node server
Otwórz inne okna terminali i spawnuj tyle klientów, ile chcesz, uruchamiając:
node client
Przygotowałem także listę z pełnym kodem tutaj .