2015-12-10 15 views
5

Próbuję utworzyć połączenie WS z moim serwerem tornado. Kod serwera jest prosta:WebSocket: Błąd podczas uzgadniania WebSocket: wysłano niepusty nagłówek "Sec-WebSocket-Protocol", ale nie otrzymano odpowiedzi

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

kopiować wklejony kod klienta z 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(); 
    } 
}); 

Gdy próbuje się połączyć i uzyskać następujące dane wyjściowe na konsoli przeglądarki:

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

Dlaczego tak jest?

+0

Po przesłaniu kodu połączenia klienta, inaczej zgadujemy ... – Myst

+0

Użyłem protokołu 'Chat-1'. W końcu usunąłem tę część i otworzyłem WS bez określania protokołu i działa w ten sposób. Wciąż jestem zainteresowany tym, jak powinienem skonfigurować stronę serwera, aby ją zaakceptować. – Midiparse

Odpowiedz

14

Jak wskazano w whatwg.org's Websocket documentation (jest to kopia z projektem w normie):

websocket (url, protokoły) konstruktor trwa jeden lub dwa argumenty. Pierwszy argument, url, określa adres URL, z którym należy się połączyć. Drugi protokół, jeśli jest obecny, jest ciągiem lub tablicą ciągów. Jeśli jest łańcuchem, jest to odpowiednik tablicy składającej się tylko z tego ciągu; jeśli zostanie pominięty, jest to odpowiednik pustej tablicy. Każdy ciąg w tablicy jest nazwą podtechniczną. Połączenie zostanie nawiązane tylko wtedy, gdy serwer zgłosi, że wybrał jeden z tych podprotokołów:. Nazwy podprotokołów muszą być ciągami pasującymi do wymagań dla elementów, które zawierają wartość pól protokołu Sec-WebSocket, zgodnie z definicją protokołu WebSocket.

Serwer odpowiada na żądania połączenia websocket z pustym Sec-WebSocket-Protocol nagłówka, ponieważ nie obsługuje Chat-1 podprotokół.

Ponieważ piszesz zarówno po stronie serwera, jak i po stronie klienta (i chyba że piszesz interfejs API, który zamierzasz udostępniać), nie powinno być super ważne ustalenie określonej nazwy podtechnicznej.

Można to naprawić albo przez usunięcie nazwy podprotokole z połączenia javascript:

var socket = new WebSocket(serviceUrl); 

Albo modyfikując swój serwer obsługuje żądanego protokołu.

Mogę podać przykład z Ruby, ale nie mogę podać przykładu w języku Python, ponieważ nie mam wystarczających informacji.

+0

Byłbym bardzo zainteresowany przykładem Ruby. Gram z klejnotami wampirów i mam ten sam problem (https://github.com/bradylove/wamp-ruby), ale używa v1. Myślę o napisaniu klejnotu vAMP WAMP ... – awenkhh

+0

@awenkhh - Nie jestem pewien, czy rozumiem twój problem. Jest to problem związany z klientem, a wspomniany klejnot jest implementacją serwera. Może mógłbyś otworzyć nowe pytanie z pełnym śladem i zostawić tutaj link? – Myst