javascript - 为 WebSocket [握手] 制作一个 PHP 套接字服务器

标签 javascript php html sockets websocket

我尝试制作自己的 PHP 套接字服务器以使用 HTML5 WebSocket API,但我无法执行握手步骤,我在这里阅读了 [rfc6455][1] 我的 PHP 服务器代码:

这里是 Javascript 代码:

var socket = new WebSocket("ws://127.0.0.1:1577/server.php");

socket.onopen = function (e) {
    console.log("openned : "+e.readyState);
}
socket.onclose = function (e) {
    console.log("Socket connection closed : "+e);
}

这里是 PHP 代码:

<?php

set_time_limit(0);
$adr = "127.0.0.1";
$port = 1577;
 
$m_sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$msg = "Welcome...";
$cls = array();
 
socket_bind($m_sock, $adr, $port);
socket_listen($m_sock, 5);
echo "Server start...\n\n";

do{
        $msgsock = socket_accept($m_sock);
 
        array_push($cls, $msgsock);
        echo "Connected...\n\n";
        usleep(100);
        //socket_write($msgsock, $msg, strlen($msg)); //this is the 'bug'
        do{
                if (false === ($buf = socket_read($msgsock, 2048, PHP_NORMAL_READ))) {
                   echo "socket_read() fail :" . socket_strerror(socket_last_error($msgsock)) . "\n";
                    break 2;
                }
                if(preg_match("/Sec-WebSocket-Key: (.*)/",$buf,$match)){ 
                        $key =  base64_encode(hash("sha1",trim($match[1])."258EAFA5-E914-47DA-95CA-C5AB0DC85B11")); 
                        $response_header =    "HTTP/1.1 101 Switching Protocols"."\r\n".
                        "Upgrade: websocket"."\r\n".
                        "Connection: Upgrade"."\r\n".
                        "Sec-WebSocket-Accept: $key"."\r\n\r\n";

                        //SERVER RESPONSE ----
                        socket_write($msgsock,$response_header,strlen($response_header));

                        echo "handshake done...";
                };
        } while(1);
        socket_close($msgsock);
} while(1);

我总是遇到这个错误:失败:WebSocket 握手期间出错:无效的状态行 [1]: https://www.rfc-editor.org/rfc/rfc6455

这里是 HTTP 请求:

HTTP 请求:

Accept-Encoding:gzip, deflate, sdch
Accept-Language:fr-FR,fr;q=0.8,en-US;q=0.6,en;q=0.4,he;q=0.2
Cache-Control:no-cache
Connection:Upgrade
Cookie:__utma=96992031.134451192.1399804258.1402844967.1402848436.4; __utmz=96992031.1399804258.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); _ga=GA1.4.134451192.1399804258; toolbarDisplay=hide
Host:127.0.0.1:1577
Origin:http://127.0.0.1
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits
Sec-WebSocket-Key:2yODScjZV/dap0DsDSWDFQ==
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36

这里是 PHP 服务器生成的响应:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: MDQ1NjFhMzc1YjY5MWQwNTU1ZGIzNDYyZmM0YTc1ODFhMDBlMzdmOQ==

最佳答案

您可以阅读 Ratchet 的源代码看看他们是怎么做的。

有一个实现握手的类here .

关于javascript - 为 WebSocket [握手] 制作一个 PHP 套接字服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27028229/

相关文章:

javascript - 服务器和浏览器之间的时间同步

javascript - 轻松查看什么 javascript 代码称为 Web 服务

javascript - 单击仅返回 jQuery 中的第一个项目值

php - 是否有可能通过 Microsoft App 注册构建通用登录系统?

php - 带有 ssl 证书和密码的 Soap 服务 (PHP)

html - 仅禁用一个电话号码的自动格式化?

html - 在窗口宽度上拉伸(stretch)容器 DIV

jquery - 在主页外为覆盖事件处理程序创建样式 Hook

javascript - 构建 HTML 选择字段并使用 JavaScript 数组选择选项

javascript - 按照添加顺序从多重上传字段获取图像