连接在打开时立即关闭

Posted

技术标签:

【中文标题】连接在打开时立即关闭【英文标题】:Connection closes immediately on open 【发布时间】:2016-12-04 07:17:30 【问题描述】:

我正在运行一个非常简单的 echo websocket 服务器,如下所示:

#!/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()

我正在使用下面的 javascript 连接到此

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

在控制台中我看到了

new connection
connection closed

我不明白为什么我在控制台中看到connection closed。客户端还表示连接已关闭,但我看不出有什么好的理由。任何帮助将不胜感激。要复制以管理员身份运行 python 代码,请打开任何 JS 控制台并输入 JS 代码。我想要的结果是套接字不会立即关闭。这有点基于我在tornado docs 中读到的内容。


edit通过在open 方法中注释掉self.write_message("Hello World") 进行更新,连接不会关闭。然而,运行文档中的示例代码现在会产生一些有趣的东西。

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

服务器端输出是

new connection
message received Hello, world
connection closed

如预期的那样,客户端没有相应的警报

新问题和旧问题一样,为什么服务器说connection closed?看起来self.write_message 可能是罪魁祸首。

【问题讨论】:

我创建了一个github issue,任何有同样问题的人都可以碰到 从 github 复制 - “Windows 不是 Tornado 完全支持的平台,因此您或多或少需要自己调试。” 【参考方案1】:

不确定这是否有任何帮助,但我运行了您的代码,它的工作方式完全符合您的预期。在我致电ws.close() 之前,我没有收到您问题中所示的连接关闭消息。 (龙卷风 4.4.1)。

无论问题是什么,它似乎都在您的环境中,而不是您的代码中。

【讨论】:

这应该是一条评论。 谢谢!我在 Windows 7 上运行 Python 3.4.4 和 Tornado 4.4。我在随机网站上将 javascript 代码放入 chrome 中的 js 控制台 我没有评论的声誉 - 不久前开始使用 ***,所以很抱歉没有发表评论。我在 Ubuntu 16.04、Python 3.5.2 和 Tornado 4.4.1 上运行了它。可以正常工作。

以上是关于连接在打开时立即关闭的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server2008打开时遇到的问题:“请验证实例名称是不是正确并且SQL Server已配置为允许远程连接”。

MSSQL 错误“底层提供程序在打开时失败”

位置服务关闭时,Windows 8 手机应用程序在打开时崩溃

可以在打开时截取 <select> 的屏幕截图

iPhone 6+ Mobile safari iOS 8 Landscape with tabs open and Bootstrap navbar-fixed-top 在打开时不会关闭

关闭或不关闭数据库中的连接