Warum ist mein WebSocket automatisch schließen?

Ich habe eine sehr grundlegende websocket-server mit tornado:

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

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

    def on_message(self, message):
        print 'message received %s' % message

    def on_close(self):
      print 'connection closed'


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


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

und eine sehr basic client, der sollte in der Lage sein, kontinuierlich zu pingen Sie den server über eine Schaltfläche klicken Sie auf:

<!DOCTYPE html>  
<meta charset="utf-8" />  
<title>WebSocket Test</title>  
<script language="javascript" type="text/javascript">

    var wsUri = "ws://localhost:8000/ws";
    var websocket = new WebSocket(wsUri);
    var output;
    function init() { 
        output = document.getElementById("outputDiv");
        if (!'WebSocket' in window){
            writeToScreen('<span style="color: red;">ERROR: Update your browser to one that supports websockets. A list can be found <a href="http://caniuse.com/websockets">here</a></span>');
        } else {
            testWebSocket();
        }
    }
    function onOpen(evt) { 
        writeToScreen("CONNECTED");
        doSend("Hi there!");
    }
    function onClose(evt) { 
        writeToScreen("DISCONNECTED");
    }
    function onMessage(evt) { 
        writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>');
        websocket.close();
    }
    function onError(evt) { 
        writeToScreen('<span style="color: red;">ERROR:</span> ' + evt.data);
    }
    function doSend(message) { 
        writeToScreen("SENT: " + message);
        websocket.send(message);
    }
    function writeToScreen(message) { 
        var pre = document.createElement("p");
        pre.style.wordWrap = "break-word";
        pre.innerHTML = message;
        output.appendChild(pre);
    }
    function testWebSocket() {
        websocket.onopen = function(evt) { onOpen(evt) };
        websocket.onclose = function(evt) { onClose(evt) };
        websocket.onmessage = function(evt) { onMessage(evt) };
        websocket.onerror = function(evt) { onError(evt) };
        document.getElementById("send").onclick = function () {
            doSend(document.getElementById("inputTxt").value);
            console.log("click registered.");
        };

    }
    window.addEventListener("load", init, false);
</script>  
</div>
<h2>WebSocket Test</h2> 
<div id="inputDiv">
    <input id="inputTxt" type="text"/>
    <button id="send" onclick=>send</button>
</div>
<div id="outputDiv">
</div>
</html>

Als ich die Seite geladen, bekomme ich:

VERBUNDEN

GESENDET: Hallo!

ANTWORT: Hallo Welt

GETRENNT

Wenn ich auf die Schaltfläche klicke, bekomme ich eine Fehlermeldung:

WebSocket ist bereits in der SCHLIEßENDEN oder GESCHLOSSENEN Zustand.

Aber, wenn ich re-instanziieren, die das websocket-Objekt in der Kommandozeile aus (über die chrome developer tools), die Schaltfläche funktioniert, und die Verbindung wird nicht geschlossen. Ich fühle, dass diese müssen einige Besonderheit von javascript ist, dass ich nicht verstehe, denn wenn das Objekt noch im Rahmen, ich verstehe nicht, warum es würde automatisch die Verbindung geschlossen.

  • Für mich, es war ein Fehler auf dem server, was die Verbindung verloren... dumme Fehler 🙂
InformationsquelleAutor mavix | 2013-11-13
Schreibe einen Kommentar