Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Προσπαθώ να κάνω ένα πολύ απλό 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.

client.PNG

server2.PNG

server1.PNG

client2.PNG

Δημοσ.

Δοκίμασε να βάλεις κάτι άλλο ως client πχ netcat. Υποπτεύομαι ότι το πρόβλημα με τον browser έχει να κάνει με SSL certificates.

Δημοσ.

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 😪

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...