Chrome 17中缺少"Sec-WebSocket-Accept"标题

all*_*arn 12 google-chrome websocket phpwebsocket

编辑: 我试过这个phpwebsocket:http://www.wilky.it/Shared/phpwebsocket.zip它可以在Firefox中运行,但我的问题仍然存在:如何让websockets与Chrome 17中的php服务器配合使用?


我在这里按照教程:http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/

似乎客户端连接,然后立即断开连接.我在控制台中发现了这个错误:

WebSocket握手期间出错:缺少"Sec-WebSocket-Accept"标头

我正在我的WAMP localhost上的Chrome 17.0.963.56中尝试启用php_sockets扩展.

我在某处看到Chrome已经改变了它所支持的内容,但它没有深入探讨如何修复它.我希望有人能指引我.(我是websockets的新手).

服务器:

{PATH}> php startDaemon.php

2012-02-20 07:02:51系统:创建套接字资源ID#7

2012-02-20 07:02:51系统:Socket绑定到localhost:8000.

2012-02-20 07:02:51系统:开始收听Socket.

2012-02-20 07:03:01 WebSocket:资源ID#8已连接!

2012-02-20 07:03:01 WebSocket:请求握手......

2012-02-20 07:03:01 WebSocket:握手......

2012-02-20 07:03:01 WebSocket:完成握手......

2012-02-20 07:03:01 WebSocket:资源ID#8已断开连接!

客户:

套接字状态:0

套接字状态:3(已关闭)

Jo *_*ngo 1

我也有同样的问题(而且我似乎无法在这里发表评论,所以我发表了回复)。

实际上,我刚刚下载并测试了 phpwebsocket。

在 safari 5.1.4 上,它工作得很好。

在 Chrome 17 上,我在脚本日志控制台中遇到了相同的错误:

Error during WebSocket handshake: 'Sec-WebSocket-Accept' header is missing
Run Code Online (Sandbox Code Playgroud)

因此,在 websocket.class.php 中,我添加到服务器返回的标头:

$accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11"));
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Error during WebSocket handshake: Sec-WebSocket-Accept mismatch
Run Code Online (Sandbox Code Playgroud)

现在,服务器收到的标头是:

GET /websocket/server.php HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: localhost:12345
Origin: http://localhost:8888
Sec-WebSocket-Key: OqMJI0t/cOl6d6JNE+Op0g==
Sec-WebSocket-Version: 13
Run Code Online (Sandbox Code Playgroud)

服务器发回的 header 为:

HTTP/1.1 101 WebSocket Protocol Handshake
Upgrade: WebSocket
Connection: Upgrade
Sec-WebSocket-Origin: http://localhost:8888
Sec-WebSocket-Location: ws://localhost:12345/websocket/server.php
Sec-WebSocket-Accept: ZjY5ODliNTViYzJlOTNkMjk4OTg3Y2U2NjQ3MTBlZjZiNzliYzk4Yg==
Run Code Online (Sandbox Code Playgroud)

Sec-WebSocket-Accept 看起来不错,但仍然存在不匹配错误。您是否发现某个地方有错误?也许协议已更改以计算 Sec-WebSocket-Accept,但我没有找到它......感谢您的帮助!

编辑:这似乎是解决方案(至少对我来说):将参数 true 添加到 SHA1 函数,如本问题线程中给出的文件中所示。因此,必须像这样找到 Sec-WebSocket-Accept:

$accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));
Run Code Online (Sandbox Code Playgroud)

并且,Sec-WebSocket-Key1 和 Sec-WebSocket-Key2 似乎不再出现在客户端请求中,相反,必须从标头中提取 $key:“Sec-WebSocket-Key”。

新问题:即使 Web 套接字连接现在可以在握手时正常工作,但在发送第一条消息时它也会断开连接。