当前位置: 首页 > 知识库问答 >
问题:

Chrome20网络插座握手

蒲曦
2023-03-14

我正在使用lemmingzshadow(web)的PHP Websocket服务器。直到现在一切都很顺利。

更新到chrome 20后,如果我想与服务器握手,它以以下错误结束

Error during WebSocket handshake: Sec-WebSocket-Protocol mismatch 

来自chrome 20的标题

GET /demo HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: gomokulive.eu:8001
Origin: http://www.gomokulive.eu
Sec-WebSocket-Key: s+AMQQu4Q10xH2AKy49byg==
Sec-WebSocket-Version: 13
Sec-WebSocket-Extensions: x-webkit-deflate-frame

返回的标题:

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: dMCVYKkF5VRrIouWFW7EYdvfD28=
Sec-WebSocket-Protocol: demo

我认为问题在于Chrome20的“Sec WebSocket Extensions:x-webkit-deflate-frame”标题。

你知道如何让它重新工作吗?

共有3个答案

轩辕成天
2023-03-14

一个简单的方法来修复是添加Sec-WebSocket-Access信息时,do_handshake,代码如下:

    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));

在哪里,

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

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

希望这能解决你的问题。。

胡向阳
2023-03-14

php websocket的快速修复方法是:

$response.= "Sec-WebSocket-Accept: " . $secAccept . "\r\n";
if (isset($headers['Sec-WebSocket-Protocol']))
{
    $response.= "Sec-WebSocket-Protocol: " . substr($path, 1) . "\r\n";
}
$response .= "\r\n";
笪成周
2023-03-14

服务器违反了WebSocket协议。很可能Chrome只是在版本20中更正确地遵守了标准,这暴露了服务器中的一个bug。

问题是服务器在响应中发送回一个“Sec-WebSocket-Protocol”标头,但只有当客户端在请求中发送相同的标头时,这才是合法的。如果客户端没有发送Sec-WebSocket-Protocol,那么服务器应该在响应中省略标头。

参见rfc6455第4.2.2节第22页的/subtocol/说明

 类似资料:
  • 我是enterprise social network product的开发人员,我正在开发一个非常类似于Facebook通知的功能。我们想为我们的客户提供一个实时的通知机制。 我正在Node.js中构建一个通知服务,我的系统可以与它交互并通知它。最大的问题是:

  • 我正在编写一个netty/websocket服务器应用程序,其中对websockent客户端(例如浏览器)的写入来自另一个线程(即不是来自websockets)。 这是netty4.0.18.Final,我的应用程序在很大程度上基于提供的websocket服务器示例。 我需要知道websocket通道何时打开,以便我可以保存ChannelHandlerContext,以便其他线程可以执行写入。我有

  • 我试图了解Socketchannes和NIO的总体情况。我知道如何使用常规套接字,以及如何为每个客户机服务器创建一个简单的线程(使用常规阻塞套接字)。 所以我的问题是: 什么是袜子通道 当我使用SocketChannel而不是Socket时,额外得到了什么 通道和缓冲区之间的关系是什么 什么是选择器 文档中的第一句话是

  • Kubernetes网络模型 IP-per-Pod,每个Pod都拥有一个独立IP地址,Pod内所有容器共享一个网络命名空间 集群内所有Pod都在一个直接连通的扁平网络中,可通过IP直接访问 所有容器之间无需NAT就可以直接互相访问 所有Node和所有容器之间无需NAT就可以直接互相访问 容器自己看到的IP跟其他容器看到的一样 Service cluster IP尽可在集群内部访问,外部请求需要通过

  • 我目前正在我的Nuxt应用程序中实现WebSocket。我有一个Laravel后端,我使用Pusher和Laravel Echo。问题是,当尝试连接/订阅专用频道时,由于客户端通过广播/authendpoint获得授权,因此未命中单个频道的auth(channels.php)。因此,登录用户有可能访问他们不应该访问的私有通道。 我的代码/配置如下: NUXT前端: 努克斯。配置。js }, 拉威尔

  • 我正在尝试向支持TLS 1.2的服务器发帖——至少当我在浏览器中执行GET时,我可以验证通信是否使用TLS 1.2,以及证书是否由证书颁发机构验证。然而,当我试图使用AFIOS 9.0(13A4305g)/Xcode 7-beta4将代码发布到该服务器时,我的握手失败了。 失败: 我错过什么了吗?我怎样才能挖得更深?假设这是服务器的问题,而不是代码的问题——我怎么能窥探到呢?