2015-12-10 2 views
5

Я пытаюсь создать WS-соединение с моим сервером торнадо. Серверный код прост:WebSocket: Ошибка при рукопожатии WebSocket: отправлен непустой заголовок «Sec-WebSocket-Protocol», но ответа не получено

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

Я использовал протокол 'Chat-1'. В конце концов я удалил эту часть и открыл WS без указания протокола и работает таким образом. Мне все еще интересно, как мне настроить серверную сторону, чтобы принять его. – Midiparse

ответ

14

Как указано в whatwg.org's Websocket documentation (это копия осадке стандарта):

WebSocket (URL, протоколы) Конструктор принимает один или два аргумента. Первый аргумент url указывает URL-адрес для подключения. Во-вторых, протоколы, если они есть, представляют собой либо строку, либо массив строк. Если это строка, она эквивалентна массиву, состоящему только из этой строки; если он опущен, он эквивалентен пустому массиву. Каждая строка в массиве является подпротокольным именем. Соединение будет установлено, только если сервер сообщает, что он выбрал один из этих подпротоков. Подпротокольные имена должны быть строками, которые соответствуют требованиям для элементов, которые содержат значение полей Sec-WebSocket-Protocol, как определено спецификацией протокола WebSocket.

Ваш сервер отвечает на запрос на подключение WebSocket с пустым Sec-WebSocket-Protocol заголовка, так как он не поддерживает Chat-1 подпротоколов.

Поскольку вы пишете как серверную, так и клиентскую сторону (и если вы не написали API, который вы собираетесь разделить), не обязательно иметь значение для определенного подпротокольного имени.

Вы можете исправить это, либо удаление подпротокола из яваскрипта соединения:

var socket = new WebSocket(serviceUrl); 

Или, изменив свой сервер для поддержки протокола запрашивал.

Я мог бы привести пример Ruby, но я не могу привести пример Python, так как у меня недостаточно информации.

+0

Мне очень понравился бы пример Ruby. Я играю с жемчужиной и имею ту же проблему (https://github.com/bradylove/wamp-ruby), но он использует v1. Я подумываю написать v2 WAMP gem ... – awenkhh

+0

@awenkhh - Я не уверен, что понимаю вашу проблему. Это проблема, связанная с клиентом, и упомянутый вами камень - это реализация сервера. Может быть, вы могли бы открыть новый вопрос с полным следом и оставить ссылку здесь? – Myst

Смежные вопросы