【发布时间】:2015-01-14 13:39:52
【问题描述】:
我尝试在 PHP 中创建一个使用当前 WebSocket 协议 13 的 Websocket 服务器。
我根据 RFC 实现了标头创建,但在 Google Chrome(版本 31)中它仍然失败,并显示错误消息 Error during WebSocket handshake: Sec-WebSocket-Accept mismatch。 Firefox 至少显示响应,但它也不会触发客户端 onOpen 事件。
下面是 PHP 中的最小测试服务器,其中包含我用来创建标头的代码:
<?php
$srv = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($srv, '0.0.0.0', 50500);
socket_listen($srv, 10);
for(;;){
$sock = socket_accept($srv);
// get header
$header = socket_read($sock, 1024);
// extract key
$keys = array();
preg_match_all("/Sec-WebSocket-Key:\s*(.*)\s*/", $header, $keys);
if(count($keys) < 1){
// Not a valid Websocket Handshake
socket_close($sock);
continue;
}
// create hash according to RFC
$key = $keys[1][0];
$accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));
// create header
$h = "HTTP/1.1 101 Switching Protocols\r\n";
$h .= "Upgrade: websocket\r\n";
$h .= "Connection: Upgrade\r\n";
$h .= "Sec-WebSocket-Accept: $accept\r\n";
$h .= "Sec-WebSocket-Protocol: 13\r\n\r\n";
echo $h;
// send header to client
socket_write($sock,$h,strlen($h));
}
?>
我在这里遗漏了什么吗?
提前致谢!
【问题讨论】:
标签: php google-chrome websocket