Eine Websocket-Applikation erstellen
Um eine Websocket-Applikation zu erstellen, muss eine Klasse erstellt werden, die von der Klasse Ego_WebsocketApplication
(lib/websockets/applications/Ego_WebsocketApplication.php) erbt. In dieser Klasse müssen die Methoden onConnect
, onDisconnect
und onMessage
definiert werden. Das könnte wie folgt aussehen:
<?php
require_once 'websockets/applications/Ego_WebsocketApplication.php';
class TestApplication extends Ego_WebsocketApplication {
/** @var Ego_WebsocketClient[] */
private array $clients = [];
/**
* @param Ego_WebsocketClient $client
*
* @return void
*/
public function onConnect(Ego_WebsocketClient $client): void {
$this->clients[$client->getClientId()] = $client;
}
/**
* @param Ego_WebsocketClient $client
*
* @return void
*/
public function onDisconnect(Ego_WebsocketClient $client): void {
unset($this->clients[$client->getClientId()]);
}
/**
* @param string $data
* @param Ego_WebsocketClient $client
*
* @return void
*/
public function onMessage(string $data, Ego_WebsocketClient $client): void {
$decodedData = $this->decodeData($data);
if ($decodedData['action'] && method_exists($this, $decodedData['action'])) {
call_user_func([$this, $decodedData['action']], $decodedData['data'], $client);
}
}
}
Den Server um Applikationen erweitern
Um dem Websocket-Server eine Applikation hinzuzufügen, muss unter var/lib/websockets
eine applications.php
hinterlegt werden. In dieser Datei muss es eine Funktion mit dem Namen get_websocket_applications
geben. Diese liefert ein Array mit allen Applikationen, die dem Server hinzugefügt werden sollen. Der Array-Schlüssel, der hier verwendet wird, wird später auch verwendet um die Applikation anzusprechen. Die Datei kann dann folgendermaßen aussehen:
<?php
require_once 'applications/TestApplication.php';
function get_websocket_applications() {
return ['test_application' => TestApplication::getInstance()];
}
Eine Websocket-Applikation ansprechen
Eine Websocket-Applikation kann über die Javascript Websocket-API angesprochen werden. Dieser Aufruf könnte wie folgt aussehen:
let webSocket = new WebSocket(`wss://${host}/ws/${application}?${user_id}`);
webSocket.addEventListener('open', () => {console.log('Websocket-Verbinding geöffnet')});
webSocket.addEventListener('message', event => {console.log('Nachricht vom Websocket-Server:', event.data)});
webSocket.addEventListener('close', () => {console.log('Websocket-Verbindung geschlossen')});
webSocket.addEventListener('error', () => {console.log('Fehler bei der Websocket-Verbindung')});
Bei application
handelt es sich um den Schlüssel der Applikation, mit der man sich verbinden möchte. Dieser entspricht dem Array-Schlüssel, der beim registrieren der Applikation verwendet wurde (In diesem Beispiel test_application
).
Bei user_id
handelt es sich um eine eindeutige Kennung des aktuellen Clients. Es ist empfohlen (aber nicht zwingend erforderlich) hier die user_id
des angemeldeten CMS-Benutzers zu verwenden.