MartinGrupinski Geschrieben 1. März 2018 Geschrieben 1. März 2018 Hallo zusammen, ich versuche gerade einen Websocket-Server aufzusetzen und ne Art kleinen Chat draus zu machen. Der Server selbst läuft mittlerweile, doch wenn ich mich mit zwei verschiedenen Browsern anmelde, sind die Browser nicht wie erwartet am selben Server angemeldet, bzw bekommt zumindest der eine Browser nicht die erwartete Nachricht vom anderen Browser. Ich finde meinen Fehler schon den ganzen Tag nicht, vielleicht hat ja jemand Lust mal drüberzuschauen und mir ggfs etwas Zeit zu sparen: WSS.php: (Die Datei, die als Deamonscript per Shell gestartet wurde) <?php require_once ($_SERVER['DOCUMENT_ROOT'] ."/Websockets/so/abstractwebsocketserver.php"); class WebSocketServer extends AbstractWebSocketServer { protected function process($user, $message) { $this->sendToAllConnectedUsers($message); } protected function connected($user) { // Do nothing: This is just an echo server, there's no need to track the user. // However, if we did care about the users, we would probably have a cookie to // parse at this step, would be looking them up in permanent storage, etc. } protected function closed($user) { // Do nothing: This is where cleanup would go, in case the user had any sort of // open files or other objects associated with them. This runs after the socket // has been closed, so there is no need to clean up the socket itself here. } } $server = new WebSocketServer("127.0.0.1", 11111); try { $server->run(); } catch (\Exception $e) { $server->stdout($e->getMessage()); } Ich denke, hier in der connected-Methode wird der Hinweis für mich sein - doch für alle Chatversionen, die ich finde, wurden keine Cookies verwendet - ich dachte, hier sollte vielleicht der user in den users-Array eingefügt werden, doch das geschieht schon in der connect-Methode der abstrakten Klasse. Den AbstractWebSocketServer habe ich von ghedipunk übernommen, zu AbstractWebSocketServer umbenannt und um die folgende Funktion erweitert: protected function sendToAllConnectedUsers($msg) { foreach($this->users as $user) { send($user, $msg); } } Die client.html: <html> <head> <title>WebSocket</title> <style type="text/css"> html, body { font: normal 0.9em arial, helvetica; } #log { width: 600px; height: 300px; border: 1px solid #7F9DB9; overflow: auto; } #msg { width: 400px; } </style> <script src="client.js" type="text/javascript"></script> </head> <body onload="init()"> <h3>WebSocket v2.00</h3> <div id="log"></div> <input id="username" type="text" /> <input id="msg" type="text" onkeypress="onkey(event)" /> <button onclick="send()">Send</button> <button onclick="quit()">Quit</button> <button onclick="reconnect()">Reconnect</button> </body> </html> und die client.js: var socket; function init() { var host = "ws://127.0.0.1:11111/WSS.php"; try { socket = new WebSocket(host); log('WebSocket - status ' + socket.readyState); socket.onopen = function(msg) { log("Welcome - status " + this.readyState); }; socket.onmessage = function(msg) { log("Empfangen: " + msg.data); }; socket.onclose = function(msg) { log("Disconnected - status " + this.readyState); }; } catch (ex) { log(ex); } $("msg").focus(); } function send() { var txt, msg, name; name = $("username").value; txt = $("msg"); msg = txt.value; if (!msg) { alert("Gib ne Nachricht ein."); return; } txt.value = ""; txt.focus(); try { socket.send(name + ": " +msg); log('Gesendet: ' + msg); } catch (ex) { log(ex); } } function quit() { if (socket != null) { log("Goodbye!"); socket.close(); socket = null; } } function reconnect() { quit(); init(); } // Utilities function $(id) { return document.getElementById(id); } function log(msg) { $("log").innerHTML += "<br>" + msg; } function onkey(event) { if (event.keyCode == 13) { send(); } } Wenn ich mich jetzt mit zwei verschiedenen Browsern auf die index.php begebe (die nur die client.html includet), sendet (und empfängt) der WebsocketServer nur im eigenen Browser, nicht im anderen. Was habe ich übersehen? Ich wälz das schon nen ganzen Moment und alle google-Suche führt nicht zum gewünschten Ergebnis. Es wird wohl was ganz dummes sein müssen, also seid bitte gnädig Danke im Voraus und lieben Gruß, Martin Zitieren
MartinGrupinski Geschrieben 1. März 2018 Autor Geschrieben 1. März 2018 Oha.. das kann weg. Der Server war überhaupt nicht am laufen, da es ne Fehlermeldung gab, weil die $_SERVER-Variable nicht gesetzt war, weils halt als Daemon gestartet wurde.. was ich also gesehen hab, war, wie JavaScript Spass mit der HTML hatte und den Server "simulierte". Wie ich die Fehlermeldung übersehen konnte, ist mir ein Rätsel. Ich entschuldige mich fürs Vergeuden eurer Zeit und bitte einen Admin darum, das möglichst schnell zu löschen, da ich nicht denke, dass dieser Faux-Pas irgendwem anders helfen kann. Vielen Dank trotzdem Grüße, Martin Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.