2016-04-19 1 views
0

Возможно ли, если несколько клиентов сокета подключены к серверу веб-сервера торнадо, чтобы отправить сообщение на конкретный? Я не знаю, есть ли возможность получить идентификатор клиента, а затем отправить сообщение этому идентификатору.python tornado websocket server отправить сообщение конкретному клиенту

Мой клиент код:

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) 

ответ

0

Когда клиент подключается к серверу 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") 

Вы также можете использовать сообщение для подключения, в этом сообщении вы должны сказать сокет идентификатор и сохранить сокет в Заявке.