2015-12-10 27 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は、プロトコル)コンストラクタは、1つのまたは2つの引数を取ります。最初の引数urlは、接続先のURLを指定します。 2番目のプロトコル(存在する場合)は、文字列か文字列の配列です。文字列の場合は、その文字列だけで構成される配列と同等です。省略された場合、空の配列と等価です。配列内の各文字列はサブプロトコル名です。 接続は、サーバーがサブプロトコルのいずれかを選択したことを報告した場合にのみ確立されます。サブプロトコル名はすべて、WebSocketプロトコル仕様で定義されているSec-WebSocket-Protocolフィールドの値を構成する要素の要件に一致する文字列でなければなりません。それはChat-1サブプロトコルをサポートしていないので、

サーバーは、空のSec-WebSocket-ProtocolヘッダとのWebSocket接続要求に応答します。

サーバー側とクライアント側の両方を作成しているので(共有するAPIを作成しない限り)、特定のサブプロトコル名を設定することは特に重要ではありません。

あなたはjavascript接続からサブプロトコル名を削除するいずれかの方法でこの問題を解決することができます

var socket = new WebSocket(serviceUrl); 

または要求されたプロトコルをサポートするようにサーバーを変更することもできます。

私はRubyの例を挙げることができましたが、私は十分な情報がないのでPythonの例を与えることはできません。

+0

私はRubyの例に非常に興味があります。私はWampの宝石で遊んでいて、同じ問題(https://github.com/bradylove/wamp-ruby)を持っていますが、v1を使用しています。私はv2 WAMPの宝石を書くことを考えています... – awenkhh

+0

@awenkhh - 私はあなたの問題を理解するか分からない。これはクライアント関連の問題です。あなたが言及した宝石はサーバーの実装です。おそらく、完全な痕跡を残して新しい質問を開き、ここにリンクを残すことができますか? – Myst

関連する問題