Google chrome ';Sec WebSocket接受';Chrome 17中缺少标题

Google chrome ';Sec WebSocket接受';Chrome 17中缺少标题,google-chrome,websocket,phpwebsocket,Google Chrome,Websocket,Phpwebsocket,编辑: 我尝试了这个phpwebsocket:它在Firefox中工作,但我的问题仍然是:如何让WebSocket与Chrome17中的php服务器一起工作 我在这里遵循教程: 看起来好像客户端连接,然后立即断开连接。我在控制台中注意到这个错误: WebSocket握手期间出错:“Sec WebSocket Accept”标头丢失 我正在我的WAMP本地主机上的Chrome17.0.963.56中试用它,并启用了php_套接字扩展 我看到有人提到Chrome已经改变了它所支持的东西,但它没有深

编辑: 我尝试了这个phpwebsocket:它在Firefox中工作,但我的问题仍然是:如何让WebSocket与Chrome17中的php服务器一起工作


我在这里遵循教程:

看起来好像客户端连接,然后立即断开连接。我在控制台中注意到这个错误:

WebSocket握手期间出错:“Sec WebSocket Accept”标头丢失

我正在我的WAMP本地主机上的Chrome17.0.963.56中试用它,并启用了php_套接字扩展

我看到有人提到Chrome已经改变了它所支持的东西,但它没有深入讨论如何修复它。我希望有人能帮我渡过难关。(我是WebSocket的新手)

服务器:

{PATH}>php startDaemon.php

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

2012-02-20 07:02:51系统:套接字绑定到本地主机:8000

2012-02-20 07:02:51系统:开始监听套接字

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(关闭)

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

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

在safari 5.1.4中,它工作得很好

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

Error during WebSocket handshake: 'Sec-WebSocket-Accept' header is missing
因此,在websocket.class.php中,我将以下内容添加到服务器返回的头中:

$accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11"));
我得到了一个错误:

Error during WebSocket handshake: Sec-WebSocket-Accept mismatch
现在,服务器接收到的头是:

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
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==
并且服务器返回的头是:

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
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==
Sec WebSocket Accept看起来不错,但仍然存在不匹配错误。你看到什么地方出错了吗?可能协议已更改为计算Sec WebSocket接受,但我找不到它。。。谢谢你的帮助

编辑:这里似乎是一个解决方案(至少对我来说):将参数true添加到SHA1函数中,如中给出的文件所示。因此,Sec WebSocket Accept必须如下所示:

$accept = base64_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));
而且,Sec-WebSocket-Key1和Sec-WebSocket-Key2似乎不再出现在客户端请求中,相反,必须从标题中提取$key:“Sec-WebSocket-key”


新问题:即使web套接字连接现在在握手时起作用,它也会在发送第一条消息时断开连接。

我注意到在Chrome 19的控制台中: 服务器不得屏蔽发送给客户端的任何帧。 也许这就是问题所在。消息一发送,它就断开连接。它在Firefox中运行良好

我修复了这个websocket问题,现在它可以在chrome上运行了。 首先,我使用:

然后,我使用了以下代码中的encode函数:

我修复了将encode函数替换为lemmingzshadow的github中connection.php文件中的函数的问题,并开始工作。该函数在\server\lib\WebSocket\connection.php文件中被称为:hybi10Encode


在函数encode:$masked=true中将此参数更改为$masked=false

一个简单的修复方法是在握手时添加
秒WebSocket Accept
信息,代码如下:

    list($resource,$host,$origin,$key) = $this->getheaders($buffer);

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

    $upgrade  = "HTTP/1.1 101 Web Socket Protocol Handshake\r\n" .
            "Upgrade: WebSocket\r\n" .
            "Connection: Upgrade\r\n" .
            "WebSocket-Origin: {$origin}\r\n" .
            "WebSocket-Location: ws://{$host}{$resource}\r\n".
            "Sec-WebSocket-Accept: " . $accept . "\r\n\r\n";
    $this->handshakes[$socket_index] = true;

    socket_write($socket,$upgrade,strlen($upgrade));
在哪里,

$accept=base64_编码(SHA1($key.“258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,true))

$key是从$buffer获得的
Sec WebSocket key
,您可以打印($buffer)来查看


希望这可以解决您的问题。

如果您可以打印收到的握手和发送的整个响应,这将非常有用。该错误表示缺少Accept值,但是如果没有看到握手请求和响应,就很难知道。我注意到您链接的服务器正在发送回响应中的许多字段。我使用的正是该链接中的代码。我不确定你到底在要求什么?我要求你在代码中添加插装,以打印握手请求(从浏览器)和响应(从服务器)。我认为你正在使用这个项目:,在我看来,使用这个分叉项目:相反,它工作得很好,没有遗漏
Sec WebSocket Accept