2012-02-20 60 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