首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我的WebSocket会自动关闭?

为什么我的WebSocket会自动关闭?
EN

Stack Overflow用户
提问于 2013-11-13 05:10:13
回答 1查看 24.2K关注 0票数 10

我已经使用龙卷风建立了一个非常基本的websocket服务器:

代码语言:javascript
运行
复制
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()

以及一个非常基本的客户端,它应该能够通过单击按钮持续地打开服务器:

代码语言:javascript
运行
复制
<!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>

当我加载页面时,我得到:

已连接 你好啊! 回复:你好世界 断开

如果单击该按钮,将得到一个错误:

WebSocket已处于关闭或关闭状态。

但是,如果我重新实例化命令行中的websocket对象(通过chrome developer工具),则按钮可以工作,并且连接不会关闭。我觉得这一定是一些我不明白的javascript的特性,因为如果对象仍然在作用域中,我就不明白为什么它会自动关闭连接。

EN

Stack Overflow用户

回答已采纳

发布于 2013-11-13 06:01:32

德普。onMessage函数正在关闭它:

代码语言:javascript
运行
复制
function onMessage(evt) { 
    writeToScreen('<span style="color: blue;">RESPONSE: ' + evt.data+'</span>');
    websocket.close();
}
票数 11
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19945792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档