2015-12-10 5 views
5

मैं अपने टर्ननाडो सर्वर के साथ डब्ल्यूएस कनेक्शन बनाने की कोशिश कर रहा हूं। सर्वर कोड सरल है:वेबसॉकेट: वेबसॉकेट हैंडशेक के दौरान त्रुटि: गैर-खाली 'सेक-वेबसेट-प्रोटोकॉल' हेडर भेजा गया लेकिन कोई प्रतिक्रिया प्राप्त नहीं हुई

class WebSocketHandler(tornado.websocket.WebSocketHandler): 

    def open(self): 
     print("WebSocket opened") 

    def on_message(self, message): 
     self.write_message(u"You said: " + message) 

    def on_close(self): 
     print("WebSocket closed") 

def main(): 

    settings = { 
     "static_path": os.path.join(os.path.dirname(__file__), "static") 
    } 


    app = tornado.web.Application([ 
      (r'/ws', WebSocketHandler), 
      (r"/()$", tornado.web.StaticFileHandler, {'path':'static/index.html'}), 
     ], **settings) 


    app.listen(8888) 
    tornado.ioloop.IOLoop.current().start() 

मैं here से ग्राहक कोड चिपकाया कॉपी:

$(document).ready(function() { 
    if ("WebSocket" in window) { 

     console.log('WebSocket is supported by your browser.'); 

     var serviceUrl = 'ws://localhost:8888/ws'; 
     var protocol = 'Chat-1.0'; 
     var socket = new WebSocket(serviceUrl, protocol); 

     socket.onopen = function() { 
      console.log('Connection Established!'); 
     }; 

     socket.onclose = function() { 
      console.log('Connection Closed!'); 
     }; 

     socket.onerror = function (error) { 
      console.log('Error Occured: ' + error); 
     }; 

     socket.onmessage = function (e) { 
      if (typeof e.data === "string") { 
       console.log('String message received: ' + e.data); 
      } 
      else if (e.data instanceof ArrayBuffer) { 
       console.log('ArrayBuffer received: ' + e.data); 
      } 
      else if (e.data instanceof Blob) { 
       console.log('Blob received: ' + e.data); 
      } 
     }; 

     socket.send("Hello WebSocket!"); 
     socket.close(); 
    } 
}); 

यह मैं ब्राउज़र के कंसोल पर निम्न आउटपुट प्राप्त कनेक्ट करने के लिए प्रयास करता है:

WebSocket connection to 'ws://localhost:8888/ws' failed: Error during WebSocket handshake: Sent non-empty 'Sec-WebSocket-Protocol' header but no response was received 

वह क्यों है?

+0

अपने क्लाइंट कनेक्शन कोड पोस्ट करें, या हम अनुमान लगाएंगे ... – Myst

+0

मैंने 'चैट -1' प्रोटोकॉल का उपयोग किया। आखिर में मैंने उस भाग को हटा दिया, और प्रोटोकॉल निर्दिष्ट किए बिना डब्ल्यूएस खोला और इस तरह से काम करता है। मुझे अभी भी दिलचस्पी है कि इसे स्वीकार करने के लिए मुझे सर्वर पक्ष को कैसे कॉन्फ़िगर करना चाहिए। – Midiparse

उत्तर

14

रूप whatwg.org's Websocket documentation में बताया (यह मानक के मसौदे से एक प्रति है):

WebSocket (यूआरएल, प्रोटोकॉल) निर्माता एक या दो तर्क लेता है। पहला तर्क, यूआरएल, यूआरएल निर्दिष्ट करता है कि किससे कनेक्ट करना है। दूसरा, प्रोटोकॉल, यदि मौजूद है, तो स्ट्रिंग या तारों की सरणी है। यदि यह एक स्ट्रिंग है, तो यह केवल उस स्ट्रिंग से युक्त सरणी के बराबर है; यदि यह छोड़ा गया है, तो यह खाली सरणी के बराबर है। सरणी में प्रत्येक स्ट्रिंग एक सबप्रोटोकॉल नाम है। कनेक्शन केवल तभी स्थापित किया जाएगा जब सर्वर रिपोर्ट करता है कि उसने इन सबप्रोटोकॉल में से एक को चुना है। उपप्रॉटोकॉल नामों को सभी स्ट्रिंग्स होना चाहिए जो वेब-सॉकेट प्रोटोकॉल विनिर्देश द्वारा परिभाषित अनुसार Sec-WebSocket-Protocol फ़ील्ड के मान वाले तत्वों की आवश्यकताओं से मेल खाते हैं।

आपके सर्वर, एक खाली Sec-WebSocket-Protocol हेडर के साथ WebSocket कनेक्शन अनुरोध का जवाब देता है, क्योंकि यह Chat-1 subprotocol समर्थन नहीं करता।

चूंकि आप दोनों सर्वर साइड और क्लाइंट साइड लिख रहे हैं (और जब तक कि आप एक एपीआई लिखने का इरादा रखते हैं), यह एक विशिष्ट उपप्रॉटोकॉल नाम सेट करने के लिए बहुत महत्वपूर्ण नहीं होना चाहिए। या

var socket = new WebSocket(serviceUrl); 

अपने सर्वर को संशोधित प्रोटोकॉल का अनुरोध का समर्थन करने के द्वारा:

आप या तो जावास्क्रिप्ट कनेक्शन से subprotocol नाम निकालकर इसका समाधान कर सकते हैं।

मैं रूबी उदाहरण दे सकता हूं, लेकिन मैं पाइथन उदाहरण नहीं दे सकता क्योंकि मेरे पास पर्याप्त जानकारी नहीं है।

+0

मुझे रुबी उदाहरण में बहुत दिलचस्पी होगी। मैं वैंप मणि के साथ खेल रहा हूं और एक ही समस्या है (https://github.com/bradylove/wamp-ruby) लेकिन यह v1 का उपयोग करता है। मैं एक v2 WAMP मणि लिखने के बारे में सोच रहा हूं ... – awenkhh

+0

@awenkhh - मुझे यकीन नहीं है कि मैं आपकी समस्या को समझता हूं। यह एक ग्राहक से संबंधित मुद्दा है और आपके द्वारा वर्णित मणि एक सर्वर कार्यान्वयन है। हो सकता है कि आप एक पूर्ण ट्रेस के साथ एक नया प्रश्न खोल सकें और यहां एक लिंक वापस छोड़ दें? – Myst

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