PHP主机未从头部接收Websocket密钥

时间:2016-07-08 00:36:18

标签: javascript php websocket

我试图在我的页面中实现websockets,并且它在开发环境中运行良好,但是当我部署到其他位置时,php主机没有收到握手所需的密钥。 (Sec-WebSocket-Key从标题中缺少,即使它正在发送(我确认它是在chrome的开发人员工具中发送的))

我正在运行一个php websocket服务器,而客户端是javascript。

要获取客户端发送的标头,我正在执行以下操作:

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($socket, 0, $port);
socket_listen($socket);

然后一旦用户连接:

$socketNew = socket_accept($socket); //accept new socket
$header = socket_read($socketNew, 1024); //read data sent by the socket

以下是现在发送的标题:

Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,ja;q=0.6
Cache-Control:no-cache
Connection:Upgrade
Cookie:--long jumble of text--
Host:--hidden--:8080
Origin:--hidden--
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits
Sec-WebSocket-Key:BuiFne7w8lCA5qt4ojEjgg==
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36

,这是PHP主机收到的标​​题:

GET / HTTP/1.1
Host: ---hidden---:8080
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
Upgrade: websocket
Origin: ---hidden---
Sec-WebSocket-Version: 13
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
Accept-Encoding: gzip, deflate, sdch
Accept-Language: en-US,en;q=0.8,ja;q=0.6
Cookie:  ---really long jumble of text---

1 个答案:

答案 0 :(得分:2)

解决这个问题相当令人沮丧和耗时,所以希望这会对某人有所帮助。

socket_read中的第二个参数是从标题中读取的最大长度。为什么你不希望所有的标题超出我的范围。我注意到在websockets的许多基本教程中,第二个参数是1024,我没想到要检查文档以查看数字的用途。事实证明,在我的情况下,这个数字几乎不会太低。我刚刚提高了这个数字,所以它在将来不会成为一个问题,现在它很有用

所以要明确:

如果这不起作用:

$header = socket_read($socketNew, 1024); //read data sent by the socket

将最大长度增加到:

$header = socket_read($socketNew, 5000); //read data sent by the socket

一旦我在这里更改了数字(以及每个其他具有最大长度参数的地方),它立即生效。