使用全局变量的 WebSocket 线程



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

这个答案完全解决了我的问题,但我想更进一步,将整个事情包装在一个线程中。

这是我的插座:

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.从不打印到控制台,让我认为套接字永远不会附加到列表中,而不是变量范围问题。

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

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

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

相关内容

  • 没有找到相关文章

最新更新