2015-12-10 17 views
5

Sto provando a creare una connessione WS con il mio server tornado. Il codice del server è semplice:WebSocket: errore durante l'handshake WebSocket: l'intestazione 'Sec-WebSocket-Protocol' non vuota non è stata ricevuta

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

copio incollato il codice del client da 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(); 
    } 
}); 

Quando si tenta di connettersi ottengo il seguente output su console del browser:

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

Perché è quello?

+0

Invia il tuo codice di connessione client, o indovineremo ... – Myst

+0

Ho usato il protocollo 'Chat-1'. Alla fine ho cancellato quella parte e aperto il WS senza specificare il protocollo e funziona in questo modo. Sono ancora interessato a come dovrei configurare il lato server per accettarlo. – Midiparse

risposta

14

Come sottolineato in whatwg.org's Websocket documentation (si tratta di una copia dal progetto della serie):

Il WebSocket (URL, protocolli) costruttore accetta uno o due argomenti. Il primo argomento, url, specifica l'URL a cui connettersi. Il secondo, i protocolli, se presenti, sono o una stringa o un array di stringhe. Se si tratta di una stringa, è equivalente a una matrice costituita da solo quella stringa; se è omesso, è equivalente alla matrice vuota. Ogni stringa nell'array è un nome subprotocollo. La connessione verrà stabilita solo se il server segnala di aver selezionato uno di questi sottoprotocolli. I nomi dei sottoprotocolli devono essere tutti stringhe che soddisfano i requisiti per gli elementi che comprendono il valore dei campi Sec-WebSocket-Protocol come definito dalla specifica del protocollo WebSocket.

Il server risponde alla richiesta di connessione websocket con un colpo di testa Sec-WebSocket-Protocol vuota, in quanto non supporta il Chat-1 subprotocol.

Dato che si sta scrivendo sia lato server che lato client (e, a meno che non si scriva un'API che si intende condividere), non dovrebbe essere molto importante impostare un nome di subprotocollo specifico.

È possibile risolvere questo problema rimuovendo il nome subprotocol dal collegamento javascript:

var socket = new WebSocket(serviceUrl); 

o modificando il server per supportare il protocollo richiesto.

Potrei dare un esempio di Ruby, ma non posso dare un esempio di Python poiché non ho abbastanza informazioni.

+0

Sarei molto interessato ad un esempio di Ruby. Sto giocando con la gemma di Wamp e ho lo stesso problema (https://github.com/bradylove/wamp-ruby) ma utilizza v1. Sto pensando di scrivere una gemma WAMP v2 ... – awenkhh

+0

@awenkhh - Non sono sicuro di aver capito il tuo problema. Questo è un problema correlato al client e la gemma che hai menzionato è un'implementazione del server. Forse potresti aprire una nuova domanda con una traccia completa e lasciare un link qui? – Myst

Problemi correlati