k33theod Δημοσ. 29 Ιουνίου 2021 Δημοσ. 29 Ιουνίου 2021 Προσπαθώ να κάνω ένα πολύ απλό websocket στο localhost αλλά κάτι δεν πάει καλά. Τον κώδικα για το php server τον πήρα από το https://www.php.net/manual/en/sockets.examples.php Ton άλλαξα λίγο και έχω αυτό <?php error_reporting(E_ALL); /* Allow the script to hang around waiting for connections. */ set_time_limit(0); /* Turn on implicit output flushing so we see what we're getting * as it comes in. */ ob_implicit_flush(); $address = 'localhost'; $port = 4448; if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) { echo "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "\n"; } else echo "Socket created\n"; if (socket_bind($sock, $address, $port) === false) { echo "socket_bind() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; } else echo "Socket is bind on address $address on port $port\n"; if (socket_listen($sock, 5) === false) { echo "socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; } else echo "Socket is listening\n"; do { if (($msgsock = socket_accept($sock)) === false) { echo "socket_accept() failed: reason: " . socket_strerror(socket_last_error($sock)) . "\n"; break; } do { $buf = socket_read($msgsock, 2048, PHP_NORMAL_READ); if (!$buf = trim($buf)) { continue; } if ($buf=="quit") break; echo "$buf\n"; } while (true); socket_close($msgsock); } while (true); socket_close($sock); ?> Τον κώδικα για js τον πήρα από https://developer.mozilla.org/en-US/docs/Web/API/WebSocket Τον άλλαξα λίγο // Create WebSocket connection. const socket = new WebSocket("ws://localhost:4448"); // Connection opened socket.addEventListener('open', function (event) { socket.send('Hello_Server!'); }); // Listen for messages socket.addEventListener('message', function (event) { console.log('Message from server ', event.data); }); Τρέχω τον server και παίρνω την εικόνα server1. Φορτώνω το html παίρνω την εικόνα client και στο server to server2. και μετά από λιγο disconnection.
kaliakman Δημοσ. 29 Ιουνίου 2021 Δημοσ. 29 Ιουνίου 2021 Δοκίμασε να βάλεις κάτι άλλο ως client πχ netcat. Υποπτεύομαι ότι το πρόβλημα με τον browser έχει να κάνει με SSL certificates.
k33theod Δημοσ. 29 Ιουνίου 2021 Μέλος Δημοσ. 29 Ιουνίου 2021 Ok Τελικά δούλεψε εν μέρει Το πρόβλημα ήταν ότι έπρεπε ο server να στείλει πίσω headers για να ολοκληρωθεί το handshake. Το ένα από αυτά χρειάζεται μια διαδικασία πριν το στείλει που περιγράφεται εδώ https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Sec-WebSocket-Accept και υλοποιείται κάπως έτσι $request = socket_read($msgsock, 5000); sleep(1); preg_match('#Sec-WebSocket-Key: (.*)\r\n#', $request, $matches); var_dump($matches); $key = base64_encode(pack( 'H*', sha1($matches[1] . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11') )); $headers = "HTTP/1.1 101 Switching Protocols\r\n"; $headers .= "Upgrade: websocket\r\n"; $headers .= "Connection: Upgrade\r\n"; $headers .= "Sec-WebSocket-Version: 13\r\n"; $headers .= "Sec-WebSocket-Accept: $key\r\n\r\n"; //echo $headers; socket_write($msgsock, $headers, strlen($headers)); Τώρα το readystatus είναι 1/open που σημαίνει ότι μπορώ να ανταλλάσω μηνύματα. Ακόμα δεν το πέτυχα όμως 🤪 Ok έστειλε και μύνημα ο client. Δεν διαβάζεται βέβαια λόγω encoding 😪
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα