2012-02-20 56 views
9

编辑: 我想这phpwebsocket:http://www.wilky.it/Shared/phpwebsocket.zip,它工作在Firefox,但我的问题仍然存在:如何获取的WebSockets与PHP服务器的工作在Chrome 17中?“二段的WebSocket-接受”标头在Chrome缺少17


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

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

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

我在启用了php_sockets扩展的WAMP本地主机上的Chrome 17.0.963.56上试了一下。

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

服务器:

{PATH}>php startDaemon.php

2012-02-20 07:02:51 System: Socket Resource id #7 created.

2012-02-20 07:02:51 System: Socket bound to localhost:8000.

2012-02-20 07:02:51 System: Start listening on Socket.

2012-02-20 07:03:01 WebSocket: Resource id #8 CONNECTED!

2012-02-20 07:03:01 WebSocket: Requesting handshake…

2012-02-20 07:03:01 WebSocket: Handshaking…

2012-02-20 07:03:01 WebSocket: Done handshaking…

2012-02-20 07:03:01 WebSocket: Resource id #8 disconnected!

客户:

Socket Status: 0

Socket Status: 3 (Closed)

+0

这将是有益的,如果你能打印发送接收握手和整个响应。该错误表明Accept值缺失,但很难知道没有看到握手请求和响应。我注意到你链接的服务器正在回复许多字段。 – kanaka 2012-02-22 14:37:38

+0

我正在使用该链接的代码。我不确定你要求的是什么? – allicarn 2012-02-29 07:37:52

+0

我要求您将代码添加到代码以打印出握手请求(来自浏览器)和响应(来自服务器)。 – kanaka 2012-02-29 14:05:39

回答

1

我有同样的问题(我似乎不能够在这里发表评论,所以我张贴回复)。

其实,我只是下载并测试了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== 

仲丁基的WebSocket-接受似乎不错,但仍存在不匹配的错误。你在某处看到一个错误吗?也许协议已经改变来计算Sec-WebSocket-Accept,但我没有找到它...感谢您的帮助!

编辑:这里似乎是解决(对我来说,至少):将如在this issue thread给出的文件中找到的参数,真正到了SHA1功能。因此,二段的WebSocket - 接受必须找到这样的:

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

而且,仲的WebSocket-键1和仲丁基的WebSocket-键2似乎不存在了在客户端请求,相反,$关键必须从头部提取:“Sec-WebSocket-Key”。

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

0

我注意到,在Chrome 19的控制台中:服务器不能屏蔽它发送给客户端的任何帧。 也许这是问题所在。只要发送消息,它就会断开连接。它在Firefox中正常工作。

我解决了这个websocket问题,现在它在chrome中工作。 首先,我用:

然后,我从所用的编码功能: https://github.com/lemmingzshadow/php-websocket

我固定替换为一个在lemmingzshadow的GitHub上的connection.php文件的编码功能,并开始工作。该函数被称为:\ server \ lib \ WebSocket \ connection.php文件中的hybi10Encode。

改变这个参数的功能编码:$屏蔽= true以$掩盖=假

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

$关键是Sec-WebSocket-Key从$缓冲了,你可以的print_r($ BUFF呃)去看看。

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

+0

您错过了修改过的代码的很大一部分。 – Jeffrey 2013-12-02 14:34:51