Erstellen und Ausführen eines Socket.io-Projekts mit ServBay
Socket.io ist eine beliebte JavaScript-Bibliothek, die speziell für den Aufbau von Echtzeit-, bidirektionalen und ereignisgesteuerten Webanwendungen entwickelt wurde. Sie basiert auf dem WebSocket-Protokoll und bietet, falls nötig, Fallback-Mechanismen (wie Long Polling), um unter verschiedensten Client- und Netzwerkbedingungen eine stabile und zuverlässige Kommunikation in Echtzeit sicherzustellen.
Diese Anleitung zeigt Ihnen Schritt für Schritt, wie Sie mit der leistungsfähigen lokalen Entwicklungsumgebung von ServBay ein Socket.io-Projekt aufsetzen, betreiben und verwalten können. ServBay stellt dafür eine vorkonfigurierte Node.js-Umgebung und eine komfortable Website-Verwaltung (vormals: Hosts) bereit, die die Entwicklung mit Socket.io wesentlich effizienter macht.
Was ist Socket.io?
Socket.io ist eine Bibliothek, die eine Echtzeit-, bidirektionale, ereignisbasierte Kommunikation ermöglicht. Sie besteht aus zwei Komponenten:
- Einer Backend-Bibliothek, die auf dem Node.js-Server läuft.
- Einer JavaScript-Client-Bibliothek, die im Browser ausgeführt wird.
Obwohl Socket.io primär WebSockets nutzt, erkennt es automatisch, wenn WebSockets nicht verfügbar sind, und weicht dann auf alternative Übertragungsmechanismen aus (wie Adobe Flash Socket, Ajax Long Polling, Ajax Multipart Streaming, Forever IFrame, JSONP Polling etc.), um maximale Kompatibilität mit älteren Browsern oder eingeschränkten Netzwerkumgebungen zu gewährleisten.
Zentrale Funktionen und Vorteile von Socket.io
- Echtzeit-Kommunikation: Ermöglicht direkten Datenaustausch zwischen Server und Client, ideal für Chat-Anwendungen, Kollaborations-Tools, Live-Dashboards und Online-Games.
- Plattformübergreifende Unterstützung: Nutzbar in Webbrowsern, mobilen Anwendungen und in Node.js-Serverumgebungen.
- Automatische Wiederverbindung: Nach Verbindungsabbrüchen versucht der Client automatisch, die Verbindung wiederherzustellen – für erhöhte Ausfallsicherheit.
- Ereignisgesteuert: Das programmatische Event-Modell erleichtert das Management asynchroner Kommunikation auf intuitive Weise.
- Räume und Namespaces: Clients können zu "Räumen" gruppiert werden, um Nachrichten gezielt zu senden; "Namespaces" ermöglichen Ressourcen-Sharing und Multiplexing über ein und dieselbe Verbindung.
- Binärdaten-Unterstützung: Senden und Empfangen von Binärdaten wird problemlos ermöglicht.
- Hohe Kompatibilität: Dank diverser Übertragungsmechanismen funktioniert Socket.io unter verschiedensten Netzwerkbedingungen zuverlässig.
Mit Socket.io können sich Entwickler auf die eigentliche Anwendungslogik konzentrieren, ohne die Komplexität der darunterliegenden Echtzeitkommunikation im Detail implementieren zu müssen.
Ein Socket.io-Projekt mit ServBay erstellen und ausführen
ServBay bietet Node.js-Entwicklern eine sofort einsatzbereite lokale Umgebung, inklusive Node.js-Laufzeit, dem Paketmanager npm und komfortablen Tools zur Verwaltung Ihrer Websites. Im Folgenden nutzen wir diese Funktionen, um ein Beispielprojekt mit Socket.io aufzusetzen und auszuführen.
Voraussetzungen
Bitte stellen Sie vorab Folgendes sicher:
- ServBay installiert: Laden Sie die aktuelle Version von ServBay herunter und installieren Sie diese.
- Node.js-Paket in ServBay installieren: Überprüfen Sie, ob das Node.js-Paket in ServBay installiert ist. Dies können Sie im ServBay-Control-Panel im Bereich "Pakete" (früher: Dienste) verwalten. Eine ausführliche Anleitung finden Sie in der Dokumentation zur Nutzung von Node.js in ServBay.
Ein Socket.io-Beispielprojekt erstellen
Im Beispiel bauen wir eine einfache Chat-Anwendung.
Projektverzeichnis initialisieren:
Öffnen Sie zunächst Ihr Terminal. ServBay empfiehlt, Website-Projekte im Verzeichnis
/Applications/ServBay/www
abzulegen. Wechseln Sie in dieses Verzeichnis, legen Sie einen neuen Ordner an, initialisieren Sie das Node.js-Projekt und installieren Sie die erforderlichen Pakete:bashcd /Applications/ServBay/www mkdir servbay-socketio-chat cd servbay-socketio-chat npm init -y npm install express socket.io
1
2
3
4
5Dies erstellt eine
package.json
-Datei und installiert die beiden Kern-Abhängigkeiten:express
(für die Bereitstellung statischer Dateien und HTTP-Anfragen) undsocket.io
(Server- und Client-Bibliothek) im Ordnerservbay-socketio-chat
.Server-Datei (
server.js
) erstellen:Erstellen Sie im Hauptverzeichnis von
servbay-socketio-chat
eine Datei namensserver.js
und fügen Sie folgenden Code ein. Diese Datei startet den HTTP-Server, bindet Socket.io ein und übernimmt die Verwaltung eingehender Verbindungen sowie die Nachrichtenübertragung.javascriptconst express = require('express'); const http = require('http'); const socketIo = require('socket.io'); const path = require('path'); // path-Modul einbinden const app = express(); // Erstellt einen HTTP-Server auf Basis der Express-Anwendung const server = http.createServer(app); // Socket.io an den HTTP-Server anhängen const io = socketIo(server); // Statische Dateien aus dem aktuellen Verzeichnis bereitstellen app.use(express.static(__dirname)); // Behandelt GET-Anfragen an die Root-URL und sendet index.html zurück app.get('/', (req, res) => { // Pfad zusammenfügen, um plattformübergreifend zu funktionieren res.sendFile(path.join(__dirname, 'index.html')); }); // Auf Socket.io-Verbindungen lauschen io.on('connection', (socket) => { console.log('a user connected'); // Protokolliert neue Benutzerverbindungen // Lauscht auf das Trennen von der Verbindung socket.on('disconnect', () => { console.log('user disconnected'); // Meldet das Trennen eines Benutzers }); // Lauscht auf das Ereignis 'chat message' socket.on('chat message', (msg) => { console.log('message: ' + msg); // Gibt empfangene Nachrichten aus // Sendet die erhaltene Nachricht an alle verbundenen Clients io.emit('chat message', msg); }); }); // Port-Nummer aus Umgebungsvariable oder Standardwert beziehen const port = process.env.PORT || 3000; server.listen(port, () => { console.log(`Server running on port ${port}`); console.log(`Access it via http://localhost:${port} (direct) or via ServBay reverse proxy`); });
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
43Erläuterungen zum Code:
express
baut einen einfachen Webserver auf und liefert dieindex.html
-Datei aus.http.createServer(app)
erzeugt den HTTP-Server als Basis für Socket.io.socketIo(server)
initialisiert Socket.io und bindet es an den Server.io.on('connection', ...)
lauscht auf neue Clients.socket.on('disconnect', ...)
erkennt das Trennen vom Server.socket.on('chat message', ...)
verarbeitet eingehende Nachrichten mit dem Event-Namen'chat message'
.io.emit('chat message', msg)
sendet Nachrichten an alle verbundenen Clients.
Client-Datei (
index.html
) erstellen:Legen Sie im Wurzelverzeichnis des Projekts die Datei
index.html
an und fügen Sie folgenden Code ein, der HTML-Struktur, Styling und die Socket.io-Client-Logik erzeugt (verantwortlich für den Nachrichtenaustausch und die Anzeige auf der Seite):html<!DOCTYPE html> <html> <head> <title>ServBay Socket.io Chat</title> <style> body { margin: 0; padding-bottom: 3rem; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } #form { background: rgba(0, 0, 0, 0.15); padding: 0.25rem; position: fixed; bottom: 0; left: 0; right: 0; display: flex; height: 3rem; box-sizing: border-box; backdrop-filter: blur(10px); } #input { border: none; padding: 0 1rem; flex-grow: 1; border-radius: 2rem; margin: 0.25rem; } #input:focus { outline: none; } #form > button { background: #333; border: none; padding: 0 1rem; margin: 0.25rem; border-radius: 3px; outline: none; color: #fff; } #messages { list-style-type: none; margin: 0; padding: 0; } #messages > li { padding: 0.5rem 1rem; } #messages > li:nth-child(odd) { background: #efefef; } .servbay-banner { background-color: #007bff; /* ServBay Blau */ color: white; text-align: center; padding: 15px 0; font-size: 22px; margin-bottom: 20px; font-weight: bold; } </style> </head> <body> <div class="servbay-banner">Willkommen bei der ServBay Socket.io Chat-Demo!</div> <ul id="messages"></ul> <form id="form" action=""> <input id="input" autocomplete="off" /><button type="submit">Senden</button> </form> <!-- Socket.io-Clientbibliothek einbinden --> <!-- Diese Datei wird vom Server zur Laufzeit automatisch bereitgestellt --> <script src="/socket.io/socket.io.js"></script> <script> // Verbindung zum Socket.io-Server aufbauen // Läuft Client und Server unter derselben Domain/Port, verbindet io() automatisch var socket = io(); var form = document.getElementById('form'); var input = document.getElementById('input'); var messages = document.getElementById('messages'); // messages-Element referenzieren form.addEventListener('submit', function(e) { e.preventDefault(); // Unterdrückt das Standardverhalten beim Absenden if (input.value) { // Sendet das 'chat message'-Ereignis und die Nachricht an den Server socket.emit('chat message', input.value); input.value = ''; // Eingabefeld leeren } }); // Lauscht auf das 'chat message'-Event vom Server socket.on('chat message', function(msg) { // Neue Listeneinträge zur Darstellung der Nachricht erzeugen var item = document.createElement('li'); item.textContent = msg; // textContent verhindert XSS messages.appendChild(item); // Nachricht in die Liste einfügen // Automatisch zur neuesten Nachricht scrollen window.scrollTo(0, document.body.scrollHeight); }); </script> </body> </html>
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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64Erläuterungen zum Code:
- Die Seite enthält Basis-HTML, CSS-Styling (inkl. eines blauen ServBay-Banners), eine Nachrichtenliste (
ul#messages
) und ein Formular (form#form
) zum Versenden von Nachrichten. <script src="/socket.io/socket.io.js"></script>
bindet die Socket.io-Clientbibliothek ein. Sie wird vom laufenden Server automatisch ausgeliefert und muss nicht selbst erstellt werden.io()
initialisiert die Verbindung zum Socket.io-Server.- Das Formular fängt das Submit-Event ab, sendet mit
socket.emit('chat message', input.value)
die Nachricht, und leert das Eingabefeld. - Der Client lauscht auf vom Server gesendete
'chat message'
-Events und listet die Nachrichten im Chatverlauf auf.
- Die Seite enthält Basis-HTML, CSS-Styling (inkl. eines blauen ServBay-Banners), eine Nachrichtenliste (
Damit ist der Basis-Code für das Socket.io-Beispielprojekt fertig. Im nächsten Schritt starten und öffnen wir das Projekt mit ServBay.
Projekt mit ServBay ausführen (Entwicklungsmodus)
Während der Entwicklung wird der Node.js-Server direkt ausgeführt und via ServBays Reverse-Proxy-Funktion auf einen lokalen Domainnamen gemappt.
Node.js-Entwicklungsserver starten:
Öffnen Sie das Terminal, wechseln Sie ins Projektverzeichnis
/Applications/ServBay/www/servbay-socketio-chat
und starten Sie den Server. Wir verwenden Port 8585 (Sie können diesen ändern):bashcd /Applications/ServBay/www/servbay-socketio-chat PORT=8585 node server.js
1
2Nach dem Start sehen Sie im Terminal z.B. die Ausgabe
Server running on port 8585
. Der Server lauscht jetzt auf Port 8585.Website in ServBay konfigurieren (Reverse Proxy):
Um über eine lokale Domain (und mit HTTPS über ServBay) zugreifen zu können, richten wir in ServBay eine neue Reverse-Proxy-Website ein:
- Öffnen Sie das ServBay-Control-Panel.
- Navigieren Sie zu "Websites" (früher: Hosts).
- Klicken Sie auf den Button für eine neue Website.
- Konfiguration:
- Name:
ServBay Socket.io Dev
(oder ein anderer passender Name) - Domains:
servbay-socketio-dev.servbay.demo
(oder eine andere.servbay.demo
-Subdomain) - Typ: Wählen Sie
Reverse Proxy
- Proxy-Ziel:
http://127.0.0.1:8585
(das ist die Adresse und der Port Ihres gestarteten Node.js-Servers)
- Name:
- Speichern Sie die Konfiguration. ServBay übernimmt alle Änderungen und startet ggf. den zugehörigen Webserver (Caddy oder Nginx).
Hinweis: Reverse Proxies sind für Socket.io unerlässlich, weil sie neben normalen HTTP-Anfragen auch das Upgrade zum WebSocket-Protokoll weiterreichen müssen. Die mitgelieferten ServBay-Konfigurationen (Caddy oder Nginx) unterstützen WebSocket-Proxying ohne zusätzliche Einrichtung.
Ausführliche Schritte zum Hinzufügen neuer Websites finden Sie unter Node.js-Entwicklungswebsite hinzufügen. Informationen zur SSL-/TLS-Einrichtung finden Sie unter Website mit SSL/TLS absichern. Sie können für die lokale Zertifikatserstellung entweder das ServBay User CA oder das ServBay Public CA verwenden.
Lokale Entwicklungsseite aufrufen:
Öffnen Sie im Browser die konfigurierte Domain, z.B.
https://servbay-socketio-dev.servbay.demo
. Sie sollten die Chatoberfläche sehen und können mit mehreren Tabs oder Geräten das Echtzeit-Chatten testen.
Projekt mit ServBay deployen (Produktivmodus)
Für den Produktivbetrieb empfiehlt sich der Einsatz eines Process Managers wie PM2 oder Forever für den stabilen Dauerbetrieb Ihres Node.js-Servers, zusammen mit dem Reverse Proxy von ServBay. Im Folgenden geht es nur um die Reverse-Proxy-Konfiguration; wir gehen davon aus, dass Ihr Node.js-Server bereits stabil im Hintergrund läuft.
Produktivserver starten:
Im Produktionsumfeld wird Node.js typischerweise mit einem Process Manager wie PM2 im Hintergrund betrieben, um automatische Neustarts zu ermöglichen:
bash# Falls PM2 noch nicht installiert ist: # npm install pm2 -g cd /Applications/ServBay/www/servbay-socketio-chat PORT=8586 NODE_ENV=production pm2 start server.js --name servbay-socketio-prod
1
2
3
4
5Damit starten Sie
server.js
mit PM2 auf Port 8586 und setzenNODE_ENV
aufproduction
. Der Process Manager stellt den zuverlässigen Hintergrundbetrieb sicher.Produktiv-Website bei ServBay konfigurieren (Reverse Proxy):
Wie im Entwicklungsmodus richten Sie eine weitere Reverse-Proxy-Website in ServBay ein, die auf den Produktionsport zeigt:
- Öffnen Sie das ServBay-Control-Panel.
- Wechseln Sie in den Bereich "Websites".
- Klicken Sie auf "Neue Website".
- Konfiguration:
- Name:
ServBay Socket.io Prod
(oder ein anderer Name) - Domains:
servbay-socketio-prod.servbay.demo
(oder eine beliebige.servbay.demo
-Domain) - Typ:
Reverse Proxy
- Proxy-Ziel:
http://127.0.0.1:8586
(der Port Ihres Node.js-Servers im Produktionsmodus)
- Name:
- Speichern Sie die Einstellungen.
Produktions-Domain aufrufen:
Nun können Sie
https://servbay-socketio-prod.servbay.demo
im Browser öffnen.
Mit ServBays Reverse-Proxy-Funktion lassen sich beliebig viele Node.js-Anwendungen – in Entwicklung oder Produktivbetrieb – komfortabel verwalten, Domains und SSL-Zertifikate zuweisen, ohne die systemweiten Hosts-Files editieren oder komplexe Webserver-Konfigurationen manuell pflegen zu müssen.
Verbindung zu ServBay-Datenbanken herstellen
ServBay unterstützt zahlreiche Datenbank-Pakete wie MySQL, MariaDB, PostgreSQL, MongoDB und Redis. Wenn Ihr Socket.io-Projekt Daten persistieren soll (z.B. Benutzer, Chatverlauf etc.), können Sie diese Datenbanken einfach anbinden. Unten finden Sie Beispielcode für den Verbindungsaufbau mit Node.js.
Wichtig: Installieren und starten Sie die nötigen Datenbank-Pakete zuerst über das ServBay-Control-Panel. Standardzugangsdaten (Port, Benutzer, Passwort) finden Sie in der ServBay-Datenbankverwaltung oder der zugehörigen Dokumentation. Das Root-Passwort für MySQL/MariaDB ist in der Regel bei der Installation von ServBay gesetzt worden. Sie können das Root-Passwort außerdem über die ServBay-Oberfläche zurücksetzen.
Verbindung zu MongoDB herstellen:
Installieren Sie Mongoose (oder das offizielle
mongodb
-Paket):bashnpm install mongoose
1In Ihrer Node.js-Datei (z.B.
server.js
oder ein separates DB-Modul):javascriptconst mongoose = require('mongoose'); // Verbindung zur lokal laufenden MongoDB (Standardport: 27017) // 'servbay_socketio_app' ist ein Beispielname für die Datenbank mongoose.connect('mongodb://localhost:27017/servbay_socketio_app', { useNewUrlParser: true, useUnifiedTopology: true, // Zusätzliche Optionen wie user, pass – falls Authentifizierung erforderlich // user: 'your_mongo_user', // pass: 'your_mongo_password' }) .then(() => console.log('MongoDB connected successfully via Mongoose')) .catch(err => console.error('MongoDB connection error:', err)); // Sie können jetzt mit mongoose.model() Schemata und Models erstellen // ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16Verbindung zu Redis herstellen:
Installieren Sie das
redis
-Paket:bashnpm install redis
1Beispielsweise in Ihrem Node.js-Code:
javascriptconst redis = require('redis'); // Redis-Clientinstanz erstellen, Standard: localhost:6379 const client = redis.createClient({ // Passwort falls erforderlich: // password: 'your_redis_password', // url: 'redis://localhost:6379' // alternativ als URL }); client.on('error', (err) => { console.error('Redis connection error:', err); }); client.on('connect', () => { console.log('Redis client connected successfully'); }); // Verbindung explizit für v4+ Versionen starten: client.connect(); // Jetzt können Sie mit dem client Redis-Befehle ausführen // Beispiel: await client.set('mykey', 'myvalue'); // ...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23Verbindung zu MariaDB / MySQL herstellen:
ServBay unterstützt sowohl MariaDB als auch MySQL. Die Vorgehensweise ist identisch. Beispiel mit dem
mariadb
-Paket (funktioniert auch mit MySQL):bashnpm install mariadb
1Abfrage in Ihrem Node.js-Code:
javascriptconst mariadb = require('mariadb'); // Verbindungspool erzeugen const pool = mariadb.createPool({ host: 'localhost', port: 3306, // Standardport für MariaDB/MySQL user: 'root', // Standardmäßig root, sofern nicht geändert password: 'password', // Das in ServBay gesetzte Passwort für root database: 'servbay_socketio_app', // Beispiel-Datenbankname connectionLimit: 5 // Größe des Connection Pools }); // Verbindung testen: pool.getConnection() .then(conn => { console.log("Connected to MariaDB/MySQL successfully"); conn.release(); // Verbindung freigeben // Pool kann jetzt für DB-Abfragen genutzt werden // Beispiel: await pool.query("SELECT 1"); // ... }) .catch(err => { console.error("MariaDB/MySQL connection error:", err); });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24Hinweis: Ersetzen Sie
password
durch das tatsächliche root-Passwort aus Ihrer ServBay-Installation. Für Anwendungen empfiehlt es sich, einen eigenen DB-User statt root anzulegen.Verbindung zu PostgreSQL herstellen:
Installieren Sie das
pg
-Paket:bashnpm install pg
1Anbindung im Node.js-Code:
javascriptconst { Pool } = require('pg'); // Verbindungspool anlegen const pool = new Pool({ user: 'user', // PostgreSQL-User (ggf. anpassen) host: 'localhost', database: 'servbay_socketio_app', // Beispiel-Datenbankname password: 'password', // Ihr in ServBay gesetztes Passwort port: 5432, // Standardport PostgreSQL }); // Verbindung testen pool.connect((err, client, done) => { if (err) { console.error('PostgreSQL connection error:', err); return; } console.log('Connected to PostgreSQL successfully'); client.release(); // Verbindung freigeben // Pool kann jetzt für DB-Abfragen genutzt werden // Beispiel: pool.query('SELECT NOW()', (err, res) => { ... }); // ... });
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23Hinweis:
user
undpassword
entsprechend den in ServBay eingestellten Werten anpassen.
Durch die Anbindung dieser Datenbanken können Sie Ihr Socket.io-Projekt um persistente Speicherung und weitere Funktionalität erweitern. Mit ServBay gelingt die lokale Einrichtung von Node.js und allen benötigten Datenbanken besonders schnell und unkompliziert.
Hinweise
- Port-Konflikte: Stellen Sie sicher, dass die von Ihrer Node.js-Anwendung genutzten Ports (in den Beispielen 8585 bzw. 8586) nicht von anderen Programmen verwendet werden. Bei Konflikten können Sie den Wert der Umgebungsvariable
PORT
ändern. - Website-Konfiguration in ServBay: Nachdem Sie einen Reverse Proxy angelegt haben, stellen Sie sicher, dass der ServBay-Webserver (Caddy oder Nginx) neu gestartet und die geänderte Konfiguration übernommen wurde.
- WebSocket-Weiterleitung: Die Reverse-Proxy-Einstellungen von ServBay unterstützen per Standard das Upgrade zu WebSockets. Bei Problemen prüfen Sie die ServBay-Webserver-Logfiles und -Konfiguration auf korrekte Einrichtung.
- Firewall: Achten Sie darauf, dass die Firewall des Betriebssystems den Zugriff auf die von ServBay und Ihren Node.js-Anwendungen verwendeten Ports (wie 80, 443, 8585, 8586 etc.) nicht blockiert.