Websocket.close() wird aufgerufen, aber nicht geschlossen, es wird kein Schließrahmen gesendetPhp

PHP-Programmierer chatten hier
Anonymous
 Websocket.close() wird aufgerufen, aber nicht geschlossen, es wird kein Schließrahmen gesendet

Post by Anonymous »

Ich habe eine HTML-/JavaScript-Chat-Webanwendung, die WebSockets verwendet. Ich habe auch einen einfachen Ubuntu Linux/Apache2/PHP-Socket-Server für WebSockets erstellt, der Vanilla PHP ohne Bibliotheken von Drittanbietern verwendet. Ich verwende das Apache2-Modul „proxy_wstunnel“, um WebSocket-Verkehr an meinen Server weiterzuleiten. Ich kann auf der Serverseite nur Standard-PHP verwenden (das heißt, ich bin aus Sicherheitsgründen nicht bereit, Erweiterungen oder Bibliotheken von Drittanbietern zu verwenden).
WebSocket ist wie folgt eingerichtet:

Code: Select all

  let ws = null;

// [...]

// set up websocket stuff
ws = new WebSocket('wss://redacted.com/ws/');
Ein typischer Textrahmen wird wie folgt gesendet:

Code: Select all

  let jOut = {act: 'u', typ: '+', usr: uname, grp: gname, tstamp: nowTimestamp()};

ws.send(JSON.stringify(jOut));
Wenn der PHP-Socket-Server läuft, kann ich mich erfolgreich mit der Web-App verbinden und Textrahmen ohne Probleme senden. Wenn ich fertig bin, rufe ich Folgendes auf, um den WebSocket zu schließen:

Code: Select all

  console.log('At ws.close()');

if (ws.readyState === WebSocket.OPEN) {
console.log('WebSocket is open, attempting to close');
ws.close();
} else {
console.log('WebSocket isn\'t open, not closing');
}
'At ws.close()' wird auf der Konsole angezeigt, aber danach nichts. Nach etwa zehn Sekunden erhalte ich dann einen WebSocket-Fehler auf der Konsole (ohne nützliche Informationen) und auch einen Hinweis, dass der WebSocket unsauber mit dem Code 1006 geschlossen wurde.
Beim Anzeigen der Entwicklertools in Firefox, Safari und Brave wird angezeigt, dass die Textrahmen (Opcode 0x1) erfolgreich gesendet wurden, aber ich sehe nie, dass der Schließrahmen (Opcode 0x8) gesendet wurde.
Auf der Serverseite, z Beim Debuggen führe ich meinen PHP-Socket-Server in der Befehlszeile aus. Ich habe einige Debug-Ausgaben für stdout eingerichtet und sehe nur, dass der Opcode 0x1 von den Web-App-Chat-Clients (die in Firefox, Safari oder Brave ausgeführt werden) empfangen wird. Ich sehe nie den Close Frame (0x8) oder einen anderen Opcode.
Der PHP-Socket-Server ist wie folgt eingerichtet:

Code: Select all

  // create socket server
$server = stream_socket_server("tcp://127.0.0.1:8088", $errno, $errstr);
Ich verwende dies, um auf Kundendaten zu warten:

Code: Select all

  $read = $clients;  // copy $clients[] to $read[][
$read[] = $server;  // add $server to $read[]
$except = null;  // unused but variable needed for stream_select
$write  = null;  // unused but variable needed for stream_select

// wait for a stream to have data or time out after 200 ms
if (stream_select($read, $write, $except, 0, 200000))
{
// [...]
}
Hier sind die Client-Socket-Lese- und Debugging-Zeilen auf dem PHP-Socket-Server:

Code: Select all

  // this is a client, so read their data
$data = fread($sock, 8192);

if ($data === '') {
// nothing available right now, but not EOF
continue;
}

if ($data !== '' && $data !== false)
{
fwrite(STDOUT, "Received frame: " . bin2hex($data) . "\n"); // Full frame in hex
fwrite(STDOUT, "Received hex opcode: " . dechex(ord($data[0]) & 15) . "\n");
}
Wenn sich der Web-App-Client angemeldet hat und der WebSocket-Handshake erfolgt, sendet der Web-Client einige Textrahmen an den Server. Diese Textrahmen werden erfolgreich an andere verbundene Clients weitergeleitet (Code nicht angezeigt). Danach versuche ich ws.close() auf dem Webclient, erhalte aber nur die folgende Debug-Ausgabe:

Code: Select all

Received frame: 81cad2260131a90460[...]
Received hex opcode: 1

Received frame: 81da632b9f561809fe[...]
Received hex opcode: 1

Received frame: 81ca90cdaafdebefcb[...]
Received hex opcode: 1
Opcode 0x8 wird nie gesehen, und der Web-Client läuft ab und gibt den zuvor erwähnten Fehler- und Schließcode 1006 aus.
Ich habe umfangreiche Websuchen durchgeführt und mit zwei verschiedenen KI-Engines herumgeprobbelt, und es war unproduktiv. Ich frage mich, ob jemand eine Idee hat, warum ws.close() nicht auf den Web-Clients ausgeführt wird, warum sie den Schließrahmen nicht an den Server senden, während Textrahmen einwandfrei funktionieren (scheint kein Netzwerkproblem zu sein).

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post