Lo stesso problema!!!
Sto cercando di scrivere una piccola applicazione in cui il client rimane in attesa di un evento da parte del server.
Sulla parte client utilizzo una WebSocket e sulla parte server utilizzo la socket tramite PHP.
Nella risposta effettuo l'handshake per la webSocket ma c'è qualcosa che non va!
Codice lato client
codice:function startConnection(){ var message = 'Ciao'; var port = 2518; // creazione websocket var websocket = new WebSocket("ws://localhost:"+ port +"/LipariStudios/tesiLaurea/sketchApps/22/server.php"); websocket.onopen = function(evt) { console.log(evt); websocket.send(message); websocket.close(); }; websocket.onclose = function(evt) { console.log(evt); }; websocket.onmessage = function(evt) { console.log(evt); }; websocket.onerror = function(evt) { console.log(evt); }; };
Sul lato server
codice:// conf //$host = 'localhost'; //$host = 'liparistudios.hostinggratis.it'; $host = '127.0.0.1'; //$host = '192.168.1.171'; $local = 'LipariStudios/tesiLaurea/sketchApps/22/server.php'; // local //$local = 'App/socketTest/01/server.php'; // remote $data = 'risposta dalla socket'; $port = 2518; $maxBufferSize = 2048; $key = '258EAFA5-E914-47DA-95CA-C5AB0DC85B11'; $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("Failed: socket_create()"); socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1) or die("Failed: socket_option()"); //socket_bind($socket, $host.'/'.$local, $port) or die("Failed: socket_bind()\n"); socket_bind($socket, $host, $port) or die("Failed: socket_bind()\n"); // attesa socket_listen($socket,20) or die("Failed: socket_listen()"); socket_accept($socket); // connessione in entrata while(true){ $numBytes = @socket_recv($socket, $buffer, $maxBufferSize, MSG_WAITALL); if ($numBytes === false) { $sockErrNo = socket_last_error($socket); switch ($sockErrNo) { case 102: // ENETRESET -- Network dropped connection because of reset case 103: // ECONNABORTED -- Software caused connection abort case 104: // ECONNRESET -- Connection reset by peer case 108: // ESHUTDOWN -- Cannot send after transport endpoint shutdown -- probably more of an error on our part, if we're trying to write after the socket is closed. Probably not a critical error, though. case 110: // ETIMEDOUT -- Connection timed out case 111: // ECONNREFUSED -- Connection refused -- We shouldn't see this one, since we're listening... Still not a critical error. case 112: // EHOSTDOWN -- Host is down -- Again, we shouldn't see this, and again, not critical because it's just one connection and we still want to listen to/for others. case 113: // EHOSTUNREACH -- No route to host case 121: // EREMOTEIO -- Rempte I/O error -- Their hard drive just blew up. case 125: // ECANCELED -- Operation canceled echo "Unusual disconnect on socket " . $socket; // disconnect break; default: echo 'Errore sconosciuto ['. $sockErrNo .']: ' . socket_strerror($sockErrNo); } } elseif ($numBytes == 0) { // disconnect echo "Client disconnected. TCP connection lost: " . $socket; } else { $tmp = str_replace("\r", '', $buffer); if (strpos($tmp, "\n\n") === false ) { continue; // If the client has not finished sending the header, then wait before sending our upgrade response. } // handshake //////////////////////////////// // • prendi gli headers e lo componi come un array associativo e lo prendi dul buffer $headers = array(); $lines = explode("\n",$buffer); foreach ($lines as $line) { if (strpos($line,":") !== false) { $header = explode(":",$line,2); $headers[strtolower(trim($header[0]))] = trim($header[1]); } elseif (stripos($line,"get ") !== false) { preg_match("/GET (.*) HTTP/i", $buffer, $reqResource); $headers['get'] = trim($reqResource[1]); } } // • prendi il protocolo // solitamente chat $subProtocol = (isset($headers['sec-websocket-protocol'])) ? $headers['sec-websocket-protocol'] : ""; // • prendi il sub protocollo // solitamente super chat $extensions = (isset($headers['sec-websocket-extensions'])) ? $headers['sec-websocket-extensions'] : ""; // • valore chiave 258EAFA5-E914-47DA-95CA-C5AB0DC85B11 // • fai lo SHA-1 della key insieme alla chiave $webSocketKeyHash = sha1($headers['sec-websocket-key'] . $key); // • chr corrispondente ascii di un carattere // • hexdec da una stringa esadecimale ne ritorna il valore decimale $rawToken = ""; for ($i = 0; $i < 20; $i++) { $rawToken .= chr(hexdec(substr($webSocketKeyHash,$i*2, 2))); } $handshakeToken = base64_encode($rawToken) . "\r\n"; // • componi la chiave // Sec-WebSocket-Accept: $handshakeToken . $subProtocol . $extensions\r\n // • componi la risposta $handshakeResponse = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: $handshakeToken$subProtocol$extensions\r\n"; // oppure // $handshakeResponse = "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: $handshakeToken$subProtocol$extensions\r\nSec-WebSocket-Protocol: chat"; // • invia la risposta alla socket socket_write($socket,$handshakeResponse,strlen($handshakeResponse)); } } socket_close($socket);
Da queste immagini si vede lo strano comportamento!
![]()


Rispondi quotando