2013-11-13 5 views
9

Я создал очень простой сервер WebSocket, используя смерч:Почему мой WebSocket автоматически закрывается?

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

и очень простой клиент, который должен быть в состоянии постоянно пинг сервера с помощью кнопки мыши:

<!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> 

Когда Я загрузить страницу, я получаю:

CONNECTED
SENT: Hi there!
RESPONSE: Hello World
DISCONNECTED

Если я нажимаю кнопку, я получаю сообщение об ошибке:

WebSocket is already in CLOSING or CLOSED state.

Но, если я повторно создаю объект websocket в командной строке (с помощью инструментов разработчика Chrome), кнопка работает, и соединение не закрывается. Я чувствую, что это должно быть какая-то идиосинкразия javascript, которую я не понимаю, потому что, если объект все еще находится в области видимости, я не понимаю, почему он автоматически закрыл соединение.

+0

Для меня была ошибка на сервере, из-за которой было потеряно соединение ... глупые ошибки :) – JBaczuk

ответ

9

Derp. Функция onMessage закрывает его:

function onMessage(evt) { 
    writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>'); 
    websocket.close(); 
} 
Смежные вопросы