【发布时间】:2016-07-08 00:36:18
【问题描述】:
我正在尝试在我的页面中实现 websockets,它在开发环境中运行良好,但是当我部署到其他位置时,php 主机没有收到握手所需的密钥。 (Sec-WebSocket-Key 是 missing 从标头,即使它正在发送(我确认它是在 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---
【问题讨论】:
-
你从哪里得到的标题?从浏览器还是其他地方?
-
来自 (php) 套接字主机。我在新连接的套接字上运行 socket_accept,然后 socket_read 来获取标题。 (然后连接失败,因为标头缺少密钥)
-
调试的第一条规则:首先检查源上的数据。 “这是正在发送的标头” --- 你不能说,你只能说那些是“正在接收”的标头。你仍然不知道发送了什么。
-
在发送前如何查看标头?
-
@zerkms 感谢您对调查标头的帮助。它最终让我找到了问题——这实际上是我在我的问题中发布的最后一行 PHP 代码。我现在就发布答案。
标签: javascript php websocket