1

我正在尝试将一些数据(文本)发送到当前套接字。

以前握手 - 好的。

然后从客户端(Chrome,最新版本)发送数据 -socket_recv接收它 - 好的。

然后,我尝试socket_recv使用socket_write-NOTHING 将我刚刚读取的内容写入同一个套接字。

任何错误(使用检查socket_last_error并且函数返回TRUE)。看起来一切正常。

但是onmessage客户端的事件没有触发。安静...

谁在PHP中使用过websockets,请帮助。

客户:

var host = "ws://192.168.0.100:5000/wbs_r1.php";

try {
    var socket = new WebSocket(host);
    message('<p class="event">Socket Status: ' + socket.readyState);

    socket.onopen = function (msg) {
        message('<p class="event">Socket Status: ' + socket.readyState + ' (open)');
        console.log(socket);
        console.log(msg);
    }

    socket.onmessage = function (msg) {
        message('<p class="message">Received: ' + msg.data);
        console.log(socket);
        console.log(msg);
    }

    socket.onclose = function (msg) {
        message('<p class="event">Socket Status: ' + socket.readyState + ' (Closed)');
        console.log(socket);
        console.log(msg);
    }

    socket.onerror = function (msg) {
        message('Error: ');
        console.log(socket);
        console.log(msg);
    }

} catch (exception) {
    message('<p>Error' + exception);
    console.log(exception);
}

服务器:

header('Content-Type: text/plain; charset=utf-8');
set_time_limit(0); 
error_reporting(E_ALL);
ob_implicit_flush(true);
$sockets = array(); 
$handshakes = array();

$sockets["wbs1"] = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($sockets["wbs1"], SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($sockets["wbs1"], "0.0.0.0", 5000);
socket_listen($sockets["wbs1"], 20);
socket_set_nonblock($sockets["wbs1"]);

echo $sockets["wbs1"] . "\n";

while(true) {
    $changed_sockets = $sockets;
    $num_sockets = socket_select($changed_sockets, $write = null, $exceptions = null, null);
    //print_r($changed_sockets);
    foreach($changed_sockets as $socket) {
        echo "\n\n\n" . "Current socket: " . $socket . "\n";
        if($socket == $sockets["wbs1"]) {
            if(($client = socket_accept($sockets["wbs1"])) >= 0) $sockets[] = $client;
            echo "Accepting socket ".$socket."\n";
            echo "Client: " . $client . "\n";
        } else {
            $index = array_search($socket, $sockets);
            $len = @socket_recv($socket, $buffer, 2048, 0);
            echo "Received " . $len . " bytes from socket ".$socket.": " . $buffer . "\n";

            if($len == 0) {
                unset($sockets[$index]);
                unset($handshakes[$index]);
                socket_close($socket);
                echo "Closing socket " . $socket . "\n";
            } else if(!isset($handshakes[$index])) {
                $buffer = substr($buffer, strpos($buffer, "Sec-WebSocket-Key: ") + 19);
                $accept = base64_encode(sha1(substr($buffer, 0, strpos($buffer, "\r\n")) . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true));

                $upgrade = "HTTP/1.1 101 Switching Protocols\r\n" .
                    "Upgrade: websocket\r\n" .
                    "Connection: Upgrade\r\n" .
                    "Sec-WebSocket-Accept: {$accept}\r\n\r\n" .
                    "Sec-Websocket-Extensions=x-webkit-deflate-frame". chr(0);

                socket_write($socket, $upgrade, strlen($upgrade));
                $handshakes[$index] = true;

                echo "Handshaking: " . $socket . "\n";
            } else {
                $msg = "Hello!!!\n\0";
                $wr = socket_write($socket,$msg);
                if(!$wr) echo socket_strerror(socket_last_error()) . "\n";
                else echo "Writing to socket " . $socket . "\n";
            }
        }
    }
}
4

0 回答 0