使用全局变量的WebSocket线程

时间:2014-12-23 00:36:07

标签: python multithreading websocket tornado

我正在尝试使用非常流行的Tornado server for Python创建一个WebSocket服务器,但我在创建一个全局范围的self变量时遇到问题,以便将数据写入外部的Web套接字上课。

This answer完全解决了我的问题,但我想更进一步,将整个事情包装成一个帖子。

这是我的插座:

wss = []

class WSHandler(tornado.websocket.WebSocketHandler):

    def check_origin(self, origin):
        return True

    def open(self):
        print ('New connection established.')
        if self not in wss:
            wss.append(self)

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

    def on_close(self):
        print ('Connection closed.')
        if self in wss:
            wss.remove(self)

这是写入套接字的类之外的方法:

def write_data(message):
    for ws in wss:
        print ("Sending: %s" % message)
        ws.write_message(message);

这是线程服务器类:

class ServerThread(threading.Thread):

    def run(self):
        print ("Starting server.")
        http_server = tornado.httpserver.HTTPServer(application)
        http_server.listen(4045)
        main_loop = tornado.ioloop.IOLoop.instance()
        main_loop.start()

    def send_data(self, message):
        write_data(message);

奇怪的是,当代码没有包含在Thread类中时,write方法可以正常工作。在上面的代码中,当我打电话:

server_thread = ServerThread()
server_thread.start()
server_thread.send_data("Ping!")
没有任何反应。输入了write_data(message)方法,但显然wss[]为空。

非常感谢您提供的任何帮助!

更新

我一直在研究这个问题无济于事。另一个奇怪的事情:New connection established.永远不会打印到控制台让我觉得套接字永远不会附加到列表而不是变量作用域问题。

1 个答案:

答案 0 :(得分:1)

您不应该使用端口4045进行HTTP / WebSocket服务,因为它被浏览器阻止。您可能会从浏览器收到错误消息:

Failed to construct 'WebSocket': The port 4045 is not allowed.

http://www-archive.mozilla.org/projects/netlib/PortBanning.html http://support.apple.com/en-us/HT203772