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!

