# WebSocket Server

Dieses Dokument beschreibt die Implementierung und Verwendung des WebSocket-Servers.

## Übersicht

Der WebSocket-Server ist als eigenständiger Prozess implementiert, der unabhängig vom HTTP-Server läuft. Dies ermöglicht langlebige Verbindungen, die mit dem PHP-FPM/Apache-Modell nicht möglich wären.

## Starten des WebSocket-Servers

Der WebSocket-Server kann mit folgendem Befehl gestartet werden:

```bash
php websocket.php
```

Oder, wenn die Ausführungsrechte gesetzt sind:

```bash
./websocket.php
```

Der Server läuft standardmäßig auf `0.0.0.0:8080` und kann über WebSocket-Clients erreicht werden.

## Konfiguration

Die Konfiguration des WebSocket-Servers erfolgt direkt in der `websocket.php`-Datei. Hier können Host und Port angepasst werden:

```php
$server->start('0.0.0.0', 8080);
```

## Implementierung von WebSocket-Controllern

WebSocket-Controller werden wie normale HTTP-Controller implementiert, geben jedoch ein `WebSocketResult`-Objekt zurück. Hier ist ein Beispiel:

```php
#[Route(path: '/chat/websocket', method: Method::GET)]
public function chatWebSocket(): WebSocketResult
{
    return new WebSocketResult()
        ->onConnect(function (WebSocketConnection $connection) {
            // Handler für neue Verbindungen
        })
        ->onMessage(function (WebSocketConnection $connection, string $message) {
            // Handler für eingehende Nachrichten
        })
        ->onClose(function (WebSocketConnection $connection, int $code, string $reason) {
            // Handler für geschlossene Verbindungen
        })
        ->onError(function (WebSocketConnection $connection, \Throwable $error) {
            // Handler für Fehler
        });
}
```

## Testen mit dem ChatController

Der bestehende `ChatController` kann als Beispiel für die Verwendung von WebSockets dienen. Um ihn zu testen:

1. Starten Sie den WebSocket-Server:
   ```bash
   php websocket.php
   ```

2. Öffnen Sie eine WebSocket-Verbindung zum Server (z.B. mit JavaScript):
   ```javascript
   const socket = new WebSocket('ws://localhost:8080/chat/websocket');
   
   socket.onopen = function(e) {
     console.log("Verbindung hergestellt");
   };
   
   socket.onmessage = function(event) {
     console.log(`Daten empfangen: ${event.data}`);
   };
   
   socket.onclose = function(event) {
     if (event.wasClean) {
       console.log(`Verbindung geschlossen, Code=${event.code} Grund=${event.reason}`);
     } else {
       console.log('Verbindung unterbrochen');
     }
   };
   
   socket.onerror = function(error) {
     console.log(`Fehler: ${error.message}`);
   };
   
   // Nachricht senden
   socket.send(JSON.stringify({
     type: 'chat_message',
     message: 'Hallo Welt!'
   }));
   ```

## Architektur

Der WebSocket-Server verwendet folgende Komponenten:

1. **websocket.php**: Einstiegspunkt und Hauptskript
2. **WebSocketServer**: Verarbeitet WebSocket-Verbindungen und -Nachrichten
3. **WebSocketConnection**: Repräsentiert eine aktive WebSocket-Verbindung
4. **WebSocketResult**: Definiert Handler für WebSocket-Ereignisse

Der Server nutzt das bestehende Routing-System, um WebSocket-Anfragen an die entsprechenden Controller weiterzuleiten.

## Vorteile gegenüber der HTTP-basierten Implementierung

1. **Langlebige Verbindungen**: Der Server kann Verbindungen über längere Zeit offen halten
2. **Echtzeit-Kommunikation**: Bidirektionale Kommunikation in Echtzeit
3. **Ressourceneffizienz**: Geringerer Overhead im Vergleich zu HTTP-Polling
4. **Skalierbarkeit**: Der WebSocket-Server kann unabhängig vom HTTP-Server skaliert werden

## Bekannte Einschränkungen

1. Der WebSocket-Server unterstützt derzeit keine SSL/TLS-Verschlüsselung direkt. Für sichere Verbindungen sollte ein Reverse-Proxy wie Nginx verwendet werden.
2. Die Implementierung ist auf einfache Anwendungsfälle ausgelegt und könnte für komplexere Szenarien erweitert werden.
