Node.js: Websockets – Teil 2

Hier nun der 2. Teil der Node.js Websockets Serie.
Im 1. Teil haben wir uns damit beschäftigt einen kleinen Server und einen Client zu bauen und überhaupt erst einmal eine Websocket-Verbindung zwischen Client und Server herzustellen.
Im 2. Teil werden wir nun den Node.js Server erweitern, so das er nicht nur Nachrichten an den aktuell angemeldeten Client sendet, sondern auch an alle anderen Clients, welche mit dem Websocket-Server verbunden sind.

Hier erstmal der Code des erweiterten Servers, die Erklärung folgt danach:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//===============================================
// Websocket Server 0.2
//===============================================
 
// Objectliste der verbundenen Clients
var ClientListe = {};
// Anzahl der Verbundenen Clients
var ClientAnzahl=0;
 
// Websocket-Server
var WebSocketServer = require('ws').Server
var wss = new WebSocketServer({host: '192.168.50.95',port: 8000});
 
wss.on('connection', function(ws) 
{
	// Client-Anzahl hochzählen
	ClientAnzahl++;
	// Client-Verbindung mit in die Client-Liste Aufnehmen
	ws['AUTH'] = ClientAnzahl;
	ClientListe[ws['AUTH']] = ws;
	// Ausgabe
	console.log('client '+ClientAnzahl+' verbunden...');
 
	ws.on('message', function(message) 
	{
		console.log('von Client empfangen: ' + message);
 
		for(client in ClientListe)
		{
			ClientListe[client].send('von Server empfangen: ' + message);
		}
 
	});
 
	ws.on('close', function() 
	{
		// Client aus der ClientListe Löschen
		delete ClientListe[ws['AUTH']];
 
		// Nachricht der Trennung an die Console ausgeben
		console.log('Client '+ ws['AUTH'] +' getrennt.');
	});
 
});

Nun zur Erklärung…
Vom Prinzip her wollen wir als Ergebnis erreichen, das sich mehrere Clients anmelden können (was schon gegeben ist) – und die Nachrichten welche von einem Client kommen, nicht nur zu diesen einen Client wieder zurück gesendet werden, sondern an alle angemeldeten Clients gesendet werden.
Um dies zu erreichen, habe ich einmal die Variable „ClientAnzahl“ eingeführt, in welcher die Anzahl aller seit dem Start des Servers verbundenen Clients steht – und das Array „ClientListe“, in dem die Socket-Objekte der Verbindungen von den Clients geschrieben werden.
Berm verbinden eines Clients zum Server, bekommt der CLient quasi eine ID, welche durch den Verbindungs-Counter „ClientAnzahl++“ hoch gezählt wird:

1
2
// Client-Anzahl hochzählen
ClientAnzahl++;

Diese ID schreiben wir hier direkt in das Websocket-Objekt mit hinein und packen dieses Objekt dann in ein Array von WebSocket-Objekten:

1
2
3
// Client-Verbindung mit in die Client-Liste Aufnehmen
ws['AUTH'] = ClientAnzahl;
ClientListe[ws['AUTH']] = ws;

Sobald eine Nachricht von einem Client kommt, wird die ClientListe mit einer for-Schleife durch iteriert und diese Nachricht an alle in der ClientListe vorkommenen Verbindungen gesendet:

1
2
3
4
for(client in ClientListe)
{
	ClientListe[client].send('von Server empfangen: ' + message);
}

Damit der Server sich nicht aufhängt sobald er eine Nachricht an einen Cient senden möchte, der zwar in der CLientListe steht, aber nicht (mehr) mit dem Server verbunden ist (Error: not opened), löschen wir das WebSocket-Objekt dieser Verbindung beim onClose aufruf durch den Client:

1
2
3
4
5
6
7
8
ws.on('close', function() 
{
	// Client aus der ClientListe Löschen
	delete ClientListe[ws['AUTH']];
 
	// Nachricht der Trennung an die Console ausgeben
	console.log('Client '+ ws['AUTH'] +' getrennt.');
});

Auf der Client-Seite hat sich nichts neues getan. der HTML Client ist noch zu dieser Server-Version hier kompatibel.

Folgendes Szenario wollen wir nun durch führen:
1. CLient 1 wird gestartet
2. Client 2 wird gestartet
3. Client 3 wird gestartet
4. Client 2 wird beendet
5. Client 4 wird gestartet
6. Client 1 sendet die nachticht „test“

Dann haben wir folgende ausgabe in der Console des Servers:

client 1 verbunden...
client 2 verbunden...
client 3 verbunden...
Client 2 getrennt.
client 4 verbunden...
von Client empfangen: test

Dazu noch die Ausgabe von Client 1:

Socket Status: 1 (open)
Gesendet : test
Empfangen: von Server empfangen: test

Und die ausgabe aller anderen Clients:

Socket Status: 1 (open)
Empfangen: von Server empfangen: test

Das war es auch schon für den 2. Teil der Node.js Websocket Serie.
Ich hoffe das ihr das Thema IMMER NOCH genauso spannend fidnet wie ich und das der 2. Teil euch auch zu etwas mehr Wissen bzgl. Node.js und Javascript geholfen hat 🙂

3 Responses to Node.js: Websockets – Teil 2

  1.  

    events.js:68
    throw arguments[1]; // Unhandled ‚error‘ event
    ^
    Error: listen EADDRNOTAVAIL
    at errnoException (net.js:769:11)
    at Server._listen2 (net.js:892:19)
    at listen (net.js:936:10)
    at Server.listen (net.js:993:9)
    at dns.js:71:18
    at process.startup.processNextTick.process._tickCallback (node.js:244:9)

    die meldung bekomme ich immer wenn ich versuche das Socket in node auszuführen

    Was habe ich vergessen?

  2. Kann man so schlecht Sagen ohne deinen Code zu sehen – lad ihn doch bitte irgendwo hoch oder schicke ihn mir an sven@frickelblog.de dann schaue ich da mal rein 🙂

     
  3.  

    Hallo Sven,

    dank deines „Multi-Client“-Server Beispiels bin ich meinem Ziel, einer nostalgischen Seefunk-Simulation mit Morse-Chat, ein ganzes Stück näher gekommen. Der Morse-Chat funktioniert nun schon mal 🙂

    Super, vielen Dank.
    Gruß aus Hamburg
    sparky

leave your comment


*

Unterstütze den Frickelblog!