0

首先,如果您能告诉我这里是否有问题:
客户:

var ws = new WebSocket('ws://localhost:9090/websocket_server.php');// ws://echo.websocket.org/echo
console.log(ws);

ws.onopen = function(e) {
    console.log("Connection open...", e);

    ws.send("Hello WebSocket!");
};

ws.onmessage = function(e) {
    if(typeof e.data === "string"){
        console.log("String message received", e, e.data);
    } else {
        console.log("Other message received", e, e.data);
    }
};

ws.onerror = function(e) {
    console.log("WebSocket Error: " , e);
};


ws.onclose = function(e) {
    console.log("Connection closed", e);
};

服务器:

<?php
defined('KEY_SUFFIX') ? null : define('KEY_SUFFIX', "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");

error_reporting(E_ALL);
set_time_limit(0);
ob_implicit_flush();

$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($sock, 'localhost', 9090);
socket_listen($sock);

while (true) {

    $client = socket_accept($sock) or die('socket_accept returned false');;

    //$buf = socket_read($client, 1024);
    $buf = null;$key=null;
    while ( $line = socket_read($client, 2048, PHP_NORMAL_READ) ) {
        $buf .= $line;
        if ( strpos($line, 'Sec-WebSocket-Key')!== false ) {
            $key = substr($line, 19);
        } else 
        if ( strpos($line, 'User-Agent')!== false ) {
            break;
        }
    }
    //echo $buf;

    $sha1 = SHA1($key.KEY_SUFFIX, true);
    $accept = base64_encode($sha1);

    $write  = "HTTP/1.1 101 Switching Protocols\n";
    $write .= "Upgrade: websocket\n";
    $write .= "connection: Upgrade\n";
    $write .= "Sec-Websocket-Accept: $accept\n";
    //$write .= "Sec-Websocket-Extensions: extension\n";

    socket_write( $client, $write, strlen($write) );

}
socket_close($sock);
?>

我以这种方式运行 php 脚本:
F:\xampp\php\php -q D:\websocket_server.php

问题:
假设一切都正确,我一直在查看 chrome 调试器网络部分并且它处于挂起状态,我希望在此过程之后我应该在 js 控制台中看到一个 onopen 事件,
这是怎么回事?我期待错了吗?
在此过程之后,服务器和客户端之间的连接应该从 0 状态变为 1 状态还是需要更多工作才能建立打开状态?

4

1 回答 1

1

我发现了问题:
错误:
1:读取 sec-websocket-key 行中的最后一个字符,这导致第 18 行 sec-websocket-accpet 的计算错误

2:不知道关于响应头的两件事:一个是您需要\r\n在每行的末尾放置,而第二个\n是您需要\r\n\r\n在标题的最后一行之后放置两个,如果不是两个,它就不起作用。(行:30-33)

现在它在客户端启动一个 onopen 事件。

<?php
    defined('KEY_SUFFIX') ? null : define('KEY_SUFFIX', "258EAFA5-E914-47DA-95CA-C5AB0DC85B11");

    error_reporting(E_ALL);
    set_time_limit(0);
    ob_implicit_flush();

    $sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    socket_bind($sock, 'localhost', 9090);
    socket_listen($sock);

    while (true) {

        $client = socket_accept($sock) or die('socket_accept returned false');;

        //$buf = socket_read($client, 1024);
        $buf = null;$key=null;
        while ( $line = socket_read($client, 2048, PHP_NORMAL_READ) ) {
            $buf .= $line;
            if ( strpos($line, 'Sec-WebSocket-Key')!== false ) {
                $key = substr($line, 19, 24); // <== mistake num 1 here
            } else 
            if ( strpos($line, 'User-Agent')!== false ) {
                break;
            }
        }
        //echo $buf;

        $sha1 = SHA1($key.KEY_SUFFIX, true);
        $accept = base64_encode($sha1);

        //mistake num 2 here
        $write  = "HTTP/1.1 101 Switching Protocols\r\n";
        $write .= "Upgrade: websocket\r\n";
        $write .= "connection: Upgrade\r\n";
        $write .= "Sec-Websocket-Accept: $accept\r\n\r\n";


        socket_write( $client, $write, strlen($write) );

    }
    socket_close($sock);
?>
于 2014-02-24T02:16:31.240 回答