【问题标题】:'Sec-WebSocket-Accept' header is missing in Chrome 17Chrome 17 中缺少“Sec-WebSocket-Accept”标头
【发布时间】:2012-03-10 13:57:37
【问题描述】:

编辑: 我尝试了这个 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 系统:套接字绑定到 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(关闭)

【问题讨论】:

  • 如果您可以打印收到的握手并发送整个响应将会很有帮助。该错误表示缺少 Accept 值,但如果没有看到握手请求和响应就很难知道。我确实注意到您链接的服务器正在发送回响应中的许多字段。
  • 我正在使用该链接中的代码。我不确定你到底要什么?
  • 我要求您在代码中添加检测以打印出握手请求(来自浏览器)和响应(来自服务器)。
  • 我认为您正在使用这个项目:github.com/GeorgeNava/phpwebsocket,在我看来,请改用这个分叉项目:github.com/esromneb/phpwebsocket,这很好用,不会丢失Sec-WebSocket-Accept

标签: google-chrome websocket phpwebsocket


【解决方案1】:

一个简单的解决方法是在do_handshake时添加Sec-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_encode(SHA1($key."258EAFA5-E914-47DA-95CA-C5AB0DC85B11", true));

$key 是 Sec-WebSocket-Key 从 $buffer 得到的,你可以 print_r($buffer) 看看。

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

【讨论】:

    【解决方案2】:

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

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

    然后我使用了以下编码功能: https://github.com/lemmingzshadow/php-websocket

    我用 lemmingzshadow 的 github 中的 connection.php 文件中的那个替换了编码函数,它开始工作了。函数调用:\server\lib\WebSocket\connection.php文件中的hybi10Encode。

    将函数encode中的这个参数:$masked = true改为$masked = false

    【讨论】:

      【解决方案3】:

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

      其实我只是下载并测试了phpwebsocket。

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

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

      Error during WebSocket handshake: 'Sec-WebSocket-Accept' header is missing
      

      所以,在 websocket.class.php 中,我在服务器返回的 header 中添加了:

      $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
      

      而服务器发回的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==
      

      Sec-WebSocket-Accept 看起来不错,但仍然存在不匹配错误。你在某处看到错误吗?可能是协议改了计算Sec-WebSocket-Accept,但是没找到……谢谢大家的帮助!

      编辑:这似乎是解决方案(至少对我而言):将参数 true 添加到 SHA1 函数中,如 this issue thread 中给出的文件中所示。所以,Sec-WebSocket-Accept 必须像这样找到:

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

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

      新问题:似乎即使网络套接字连接现在在握手时工作,它也会在发送第一条消息时断开连接。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-04
        • 2016-04-19
        • 1970-01-01
        • 2016-06-28
        • 1970-01-01
        • 2012-04-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多