【问题标题】:Websocket key not being received from header by PHP hostPHP主机未从标头接收Websocket密钥
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2022-12-14
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 2020-07-15
    • 2011-06-23
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多