我试图在我的页面中实现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---
答案 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
一旦我在这里更改了数字(以及每个其他具有最大长度参数的地方),它立即生效。