2016-07-29 98 views
4

立即关闭我正在下面一个非常简单的回声的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。客户端还表示连接已关闭,但我没有看到任何好的理由。任何帮助将不胜感激。要复制以admin身份运行python代码,请打开任何JS控制台并输入JS代码。我希望的结果是套接字不能立即关闭。这有点基于我在tornado docs中读到的内容。


编辑更新由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可能是罪魁祸首。

+0

我创建了一个[github问题](https://github.com/tornadoweb/tornado/issues/1793),任何有同样问题的人都可以碰到从github复制的 – user25064

+0

- “Windows不是一个完全支持的平台龙卷风,所以你或多或少都会自己调试。“ – user25064

回答

0

不知道这是否有用,但我运行了你的代码,它的工作原理与你期望的一样。我没有收到您的问题中指出的关闭连接消息,直到我致电ws.close()。 (龙卷风4.4.1)。

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

+3

这应该可能是一条评论。 – jfriend00

+0

谢谢!我在Windows 7上运行带有Tornado 4.4的Python 3.4.4。我在随机网站上的Chrome浏览器中将JavaScript代码扔进了js控制台 – user25064

+0

我没有评论的声望 - 不久之前就开始使用Stackoverflow,因此对于不发表评论的道歉。 我在Ubuntu 16.04,Python 3.5.2和Tornado 4.4.1上运行了这个。按原样工作。 –