2012-02-20 8 views
9

संपादित करें: मैं इस phpwebsocket की कोशिश की: http://www.wilky.it/Shared/phpwebsocket.zip और यह फ़ायरफ़ॉक्स में काम करता है, लेकिन मेरे सवाल अभी भी बना हुआ: कैसे मैं एक php सर्वर के साथ काम करने के लिए WebSockets मिलता है क्रोम 17 में?'सेक-WebSocket-स्वीकार करें' शीर्षक क्रोम में याद आ रही है 17


मैं ट्यूटोरियल यहाँ अनुसरण कर रहा हूं: http://net.tutsplus.com/tutorials/javascript-ajax/start-using-html5-websockets-today/

ऐसा लगता है कि ग्राहक जोड़ता है, और फिर तुरंत डिस्कनेक्ट। मैं php_sockets एक्सटेंशन सक्षम के साथ मेरे WAMP स्थानीय होस्ट पर क्रोम 17.0.963.56 में यह कोशिश कर रहा हूँ

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

: मैं कंसोल में इस त्रुटि देखा।

मैंने देखा कि क्रोम ने जो कुछ भी समर्थित किया है, उसे बदल दिया है, लेकिन यह ठीक करने के तरीके पर गहराई से नहीं चला। मैं उम्मीद कर रहा था कि कोई मुझे इसके माध्यम से कदम दे सकता है। (मैं 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

यदि आप प्राप्त हैंडशेक और पूरी प्रतिक्रिया भेजी जा सकती हैं तो यह सहायक होगा। त्रुटि इंगित करती है कि स्वीकृति मान गुम है लेकिन हैंडशेक अनुरोध और प्रतिक्रिया को देखे बिना जानना मुश्किल है। मुझे लगता है कि आपके द्वारा लिंक किया गया सर्वर प्रतिक्रिया में कई फ़ील्ड पर वापस भेज रहा है। – kanaka

+0

मैं उस लिंक से बिल्कुल कोड का उपयोग कर रहा हूं। मुझे यकीन नहीं है कि आप वास्तव में क्या पूछ रहे हैं? – allicarn

+0

मैं हैंडशेक अनुरोध (ब्राउज़र से) और प्रतिक्रिया (सर्वर से) को मुद्रित करने के लिए कोड में उपकरण जोड़ने के लिए कह रहा हूं। – kanaka

उत्तर

1

मैं एक ही समस्या है (और मैं यहाँ एक टिप्पणी पोस्ट करने में सक्षम होने की नहीं है, तो मैं एक उत्तर पोस्ट)।

असल में, मैंने अभी डाउनलोड किया और phpwebsocket का परीक्षण किया।

सफारी 5.1.4 पर, यह ठीक काम करता है।

क्रोम 17 पर, मैं स्क्रिप्ट लॉग कंसोल में एक ही त्रुटि मिली:

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

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

तो, websocket.class.php में, मैं शीर्ष लेख सर्वर द्वारा लौटाए को जोड़ा गया

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 की गणना करने के लिए बदल गया है, लेकिन मुझे यह नहीं मिला ... आपकी मदद के लिए धन्यवाद!

संपादित करें: यहाँ समाधान लगता है (मेरे लिए, कम से कम): पैरामीटर SHA1 कार्य करने के लिए सच है, के रूप में this issue thread में दी गई फ़ाइलों में पाया गया। तो, सेक-WebSocket-स्वीकार इस तरह मिल जाना चाहिए:

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

और, धारा-WebSocket-कुंजी 1 और धारा-WebSocket-Key2 ग्राहक के अनुरोध में अब और उपस्थित होना प्रतीत नहीं होता है, बजाय, $ कुंजी शीर्षलेख से निकाला जाना चाहिए: "सेक-वेबसॉकेट-कुंजी"।

नया मुद्दा: ऐसा लगता है कि वेब सॉकेट कनेक्शन अब हैंडशेक पर काम करता है, फिर भी जब पहला संदेश भेजा जाता है तो यह डिस्कनेक्ट हो जाता है।

0

मैंने देखा कि क्रोम 1 9: के कंसोल में एक सर्वर को क्लाइंट को भेजे गए किसी भी फ्रेम को मुखौटा नहीं करना चाहिए। शायद यह समस्या है। जैसे ही एक संदेश भेजा जाता है, यह डिस्कनेक्ट हो जाता है। यह फ़ायरफ़ॉक्स में ठीक काम करता है।

मैंने इस वेबसाकेट समस्या को ठीक किया और यह अब क्रोम में काम करता है। सबसे पहले मैं प्रयोग किया है: मैं lemmingzshadow के GitHub में connection.php फ़ाइल में से एक के साथ एनकोड समारोह की जगह तय की और यह काम करना शुरू किया https://github.com/lemmingzshadow/php-websocket

:

तब मैं से एनकोड समारोह का इस्तेमाल किया। फ़ंक्शन को कॉल किया जाता है: \BI \ lib \ WebSocket \ connection.php फ़ाइल में hybi10Encode।

परिवर्तन समारोह एनकोड में इस पैरामीटर: $ नकाबपोश = नकाबपोश $ के लिए सही = false

-1

Sec-WebSocket-Accept जानकारी जब 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)); 

जहां,

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

$ कुंजी Sec-WebSocket-Key $ बफर से मिल गया है, तो आप कर सकते हैं print_r ($ शौकीन एर) एक नज़र रखना है।

आशा है कि यह आपकी समस्या का समाधान कर सके ..

+0

आप संशोधित कोड का एक बड़ा हिस्सा गायब हैं। – Jeffrey

संबंधित मुद्दे