python tornado websocket服务器向特定客户端发送消息

时间:2016-04-19 08:02:06

标签: python websocket tornado

如果多个套接字客户端连接到龙卷风websocket服务器,是否可以向特定的一个发送消息? 我不知道是否有可能获得客户的ID,然后向该ID发送消息。

我的客户代码是:

from tornado.ioloop import IOLoop, PeriodicCallback
from tornado import gen
from tornado.websocket import websocket_connect


class Client(object):
    def __init__(self, url, timeout):
        self.url = url
        self.timeout = timeout
        self.ioloop = IOLoop.instance()
        self.ws = None
        self.connect()
        PeriodicCallback(self.keep_alive, 20000, io_loop=self.ioloop).start()
        self.ioloop.start()


    @gen.coroutine
    def connect(self):
        print "trying to connect"
        try:
            self.ws = yield websocket_connect(self.url)
        except Exception, e:
            print "connection error"
        else:
            print "connected"

            self.run()

    @gen.coroutine
    def run(self):


        while True:
            msg = yield self.ws.read_message()
            print msg
            if msg is None:
                print "connection closed"
                self.ws = None
                break

    def keep_alive(self):
        if self.ws is None:
            self.connect()
        else:
            self.ws.write_message("keep alive")

if __name__ == "__main__":
    client = Client("ws://xxx", 5 )

1 个答案:

答案 0 :(得分:1)

当您的客户端连接到websocket服务器时,将调用方法'打开'在WebSocketHandler上,在此方法中,您可以将套接字保留在Appliaction中。

像这样:

from tornado import web
from tornado.web import url
from tornado.websocket import WebSocketHandler


class Application(web.Application):
    def __init__(self):
        handlers = [
            url(r"/websocket/server/(?P<some_id>[0-9]+)/", WebSocketServer),
        ]
        web.Application.__init__(self, handlers)
        self.sockets = {}


class WebSocketServer(WebSocketHandler):

    def open(self, some_id):
        self.application.sockets[some_id] = self

    def on_message(self, message):
        self.write_message(u"You said: " + message)

    def on_close(self):
        print("WebSocket closed")

您也可以使用message进行连接,在此消息中您必须告诉socket id并将socket保存到Application中。