2016-07-29 30 views
4

Ich bin wie unten ein sehr einfaches Echo websocket Server ausgeführt wird:Verbindung schließt sofort auf offene

#!/usr/bin/python 

import datetime 
import tornado.httpserver 
import tornado.websocket 
import tornado.ioloop 
import tornado.web 



class WSHandler(tornado.websocket.WebSocketHandler): 
    clients = [] 
    def open(self): 
     print('new connection') 
     self.write_message("Hello World") 
     WSHandler.clients.append(self) 

    def on_message(self, message): 
     print('message received %s' % message) 
     self.write_message('ECHO: ' + message) 

    def on_close(self): 
     print('connection closed') 
     WSHandler.clients.remove(self) 

    @classmethod 
    def write_to_clients(cls): 
     print("Writing to clients") 
     for client in cls.clients: 
      client.write_message("Hi there!") 

    def check_origin(self, origin): 
     return True 



application = tornado.web.Application([ 
    (r'/websocket', WSHandler), 
]) 


if __name__ == "__main__": 
    http_server = tornado.httpserver.HTTPServer(application) 
    http_server.listen(80) 
    tornado.ioloop.IOLoop.instance().start() 

ich verbinden bin daran mit Javascript, wie unten

var ws = new WebSocket("ws://localhost:80/websocket"); 

in der Konsole sehe ich

new connection 
connection closed 

Was ich nicht verstehe ist, warum ich die connection closed in der Konsole sehe. Der Client gibt auch an, dass die Verbindung geschlossen ist, aber ich sehe keinen guten Grund dafür. Jede Hilfe würde sehr geschätzt werden. Um den Python-Code als admin zu replizieren, öffnen Sie eine beliebige JS-Konsole und geben Sie den JS-Code ein. Mein gewünschtes Ergebnis ist, dass die Steckdose nicht sofort geschlossen wird. Dies basiert etwas auf dem, was ich in der tornado docs gelesen habe.


bearbeiten Update von self.write_message("Hello World") im open Verfahren auszukommen, funktioniert die Verbindung nicht geschlossen. Das Ausführen des Beispielcodes aus den Dokumenten liefert jedoch etwas Interessantes.

var ws = new WebSocket("ws://localhost:80/websocket"); 
ws.onopen = function() { 
    ws.send("Hello, world"); 
}; 
ws.onmessage = function (evt) { 
    alert(evt.data); 
}; 

Server-Seite ausgegeben wird

new connection 
message received Hello, world 
connection closed 

Es gibt keine entsprechende Warnung, wie auf der Client-Seite erwartet

Die neue Frage ist das gleiche wie die alten weshalb der Server connection closed sagen ? Es sieht so aus, als ob self.write_message der Schuldige sein könnte.

+0

Ich habe ein [github Problem] (https://github.com/tornadoweb/tornado/issues/1793) erstellt, dass jeder mit dem gleichen Problem – user25064

+0

von github kopiert stoßen kann - "Windows ist keine vollständig unterstützte Plattform für Tornado, also bist du mehr oder weniger damit beschäftigt, das zu debuggen. " – user25064

Antwort

0

Nicht sicher, ob dies in irgendeiner Weise hilfreich ist, aber ich habe Ihren Code ausgeführt und es funktioniert genau so, wie Sie es erwarten würden, dass es funktioniert. Ich bekomme die Nachricht "Verbindung geschlossen" nicht wie in Ihrer Frage angegeben, bis ich ws.close() anrufe. (Tornado 4.4.1).

Was auch immer das Problem ist, es scheint in Ihrer Umgebung zu sein, nicht in Ihrem Code.

+3

Das sollte wohl ein Kommentar sein. – jfriend00

+0

Danke! Ich bin auf Windows 7 mit Python 3.4.4 mit Tornado 4.4. Ich warf den Javascript-Code in die js-Konsole in Chrom auf zufälligen Websites – user25064

+0

Ich habe nicht den Ruf zu kommentieren - mit Stackoverflow vor nicht allzu langer Zeit begonnen, so Entschuldigungen für nicht kommentieren. Ich lief dies auf Ubuntu 16.04, Python 3.5.2 und Tornado 4.4.1. Funktioniert wie es sollte. –