diff --git a/README.md b/README.md index d9193b5..32835fb 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ npm start ``` Der Server startet mit `nodemon` und ist anschließend unter Port **3000** erreichbar. -Der Socket.IO-Server läuft separat auf Port **3001**. +Die WebSocket-Verbindung läuft über denselben Port — es ist kein zweiter Port nötig. ### Port ändern @@ -65,7 +65,7 @@ scoreboard/ ├── bin/www # HTTP-Server, startet die App ├── db.json # Persistente Liste bekannter Teamnamen ├── controllers/ -│ ├── socketio.js # Socket.IO-Server (Port 3001) +│ ├── socketio.js # Socket.IO-Server (teilt sich den HTTP-Port) │ ├── timer.js # Timer-Logik (Start, Pause, Reset, IncDec) │ ├── score.js # Score-Logik (Punkte, Teams, Seitenwechsel) │ ├── db.js # Lesen/Schreiben der Teamnamen in db.json @@ -73,7 +73,7 @@ scoreboard/ │ └── cli.js # Start/Stop des Kiosk-Browsers auf dem Anzeigerechner ├── routes/ │ ├── admin.js # REST-Endpunkte für das Admin-Panel -│ └── index.js # Monitor-Ansicht + WebSocket-Verbindungshandler +│ └── index.js # Monitor-Ansicht (waehlt das passende Template) ├── views/ │ ├── admin.hbs # Admin-Panel (Handlebars-Template) │ ├── splashscreen.hbs # Monitor: Vereinslogo @@ -183,7 +183,7 @@ Admin-Panel (Browser) ├── controllers/db.js ──┐ │ └── controllers/cli.js │ │ io.sockets.emit(event, data) │ ▼ - db.json Socket.IO-Server :3001 + db.json Socket.IO (am selben Port) │ WebSocket-Verbindung │ @@ -197,6 +197,12 @@ Der gesamte Spielzustand (Timer, Score, Teams, Schalter) liegt **im Arbeitsspeicher** der Controller. Ein Serverneustart setzt ihn zurück; einzig die Teamnamen in `db.json` bleiben erhalten. +Bricht die WebSocket-Verbindung ab — auf dem Pi, der das WLAN selbst aufspannt, +kommt das vor — verbindet sich der Client automatisch neu und holt sich beim +`connect`-Event den aktuellen Stand über die REST-Endpunkte. Ein **Wechsel der +Ansicht** während der Trennung (Splashscreen, Scoreboard ein/aus) wird dabei +nicht bemerkt; dafür ist "Monitor neu laden" gedacht. + ### WebSocket-Events | Event | Richtung | Beschreibung | diff --git a/scoreboard/bin/www b/scoreboard/bin/www index 95be052..a5def02 100644 --- a/scoreboard/bin/www +++ b/scoreboard/bin/www @@ -7,6 +7,7 @@ var app = require('../app'); var debug = require('debug')('scoreboard:server'); var http = require('http'); +var io = require('../controllers/socketio'); /** * Get port from environment and store in Express. @@ -21,6 +22,12 @@ app.set('port', port); var server = http.createServer(app); +/** + * Attach Socket.IO to the same server, so it shares the HTTP port. + */ + +io.attach(server); + /** * Listen on provided port, on all network interfaces. */ diff --git a/scoreboard/controllers/socketio.js b/scoreboard/controllers/socketio.js index f02ec39..8647b03 100644 --- a/scoreboard/controllers/socketio.js +++ b/scoreboard/controllers/socketio.js @@ -1,13 +1,15 @@ -// Erstellt den zentralen Socket.IO-Server auf Port 3001. +// Erstellt den zentralen Socket.IO-Server. // Wird von timer.js, score.js und den Routen importiert, // um Events (Timer, Score, Refresh) an alle verbundenen Clients zu senden. const { Server } = require('socket.io'); -// CORS auf "*" gesetzt, da Admin und Monitor auf unterschiedlichen Ports laufen können -const io = new Server(3001, { - cors: { origin: "*" } -}); +// Der Server wird ohne eigenen Port erzeugt und in bin/www per io.attach() an den +// HTTP-Server gehaengt. Dieses Modul wird beim Laden der Routen ausgewertet, also +// bevor der HTTP-Server existiert — daher die Trennung von Erzeugen und Anhaengen. +// Weil Socket.IO damit unter derselben Herkunft laeuft wie die Seite, entfaellt die +// CORS-Ausnahme. +const io = new Server(); // Verbindungs-Handling: der Client meldet sich beim Verbinden selbst mit dem // Socket.IO-eigenen 'connect'-Event und holt sich den aktuellen Stand ueber die diff --git a/scoreboard/public/javascripts/admin.js b/scoreboard/public/javascripts/admin.js index 67d4ec2..ddc2ea6 100644 --- a/scoreboard/public/javascripts/admin.js +++ b/scoreboard/public/javascripts/admin.js @@ -1,5 +1,6 @@ -let wss = "ws://" + window.location.hostname + ":3001" // Build socketio endpoint from window.location -const socket = io(wss); // Connect to socketio server +// Socket.IO laeuft am selben Host und Port wie die Seite, io() ohne Argument +// verbindet sich dorthin zurueck. +const socket = io(); // ###################################################################################################################################################### // Websockets event handler diff --git a/scoreboard/public/javascripts/index.js b/scoreboard/public/javascripts/index.js index 4410c9b..9a2dc0f 100644 --- a/scoreboard/public/javascripts/index.js +++ b/scoreboard/public/javascripts/index.js @@ -1,5 +1,6 @@ -let wss = "ws://" + window.location.hostname + ":3001" // Build socketio endpoint from window.location -const socket = io(wss); // Connect to socketio server +// Socket.IO laeuft am selben Host und Port wie die Seite, io() ohne Argument +// verbindet sich dorthin zurueck. +const socket = io(); // ###################################################################################################################################################### // Websockets event handler diff --git a/scoreboard/public/javascripts/indexScore.js b/scoreboard/public/javascripts/indexScore.js index db99789..5553845 100644 --- a/scoreboard/public/javascripts/indexScore.js +++ b/scoreboard/public/javascripts/indexScore.js @@ -1,5 +1,6 @@ -let wss = "ws://" + window.location.hostname + ":3001" // Build socketio endpoint from window.location -const socket = io(wss); // Connect to socketio server +// Socket.IO laeuft am selben Host und Port wie die Seite, io() ohne Argument +// verbindet sich dorthin zurueck. +const socket = io(); // ###################################################################################################################################################### // Websockets event handler diff --git a/scoreboard/public/javascripts/splashscreen.js b/scoreboard/public/javascripts/splashscreen.js index a46f235..03bcc1f 100644 --- a/scoreboard/public/javascripts/splashscreen.js +++ b/scoreboard/public/javascripts/splashscreen.js @@ -1,5 +1,6 @@ -let wss = "ws://" + window.location.hostname + ":3001" // Build socketio endpoint from window.location -const socket = io(wss); // Connect to socketio server +// Socket.IO laeuft am selben Host und Port wie die Seite, io() ohne Argument +// verbindet sich dorthin zurueck. +const socket = io(); // ###################################################################################################################################################### // Websockets event handler