событие отключения в чате с длинным опросом торнадо

Я работаю над приложением чата, которое использует Tornado на бэкэнде. Я использовал длинный опрос, чтобы получить количество онлайн-пользователей и любое новое сообщение чата, доступное на сервере. Я открыл два длинных соединения для опроса с сервером.

Хотя очень легко обнаружить, когда пользователь вышел в интернет. Я закодировал этот класс, который ведет список (пользователей) пользователей, которые вошли в сеть. Этот список легко отправить любому клиенту, запрашивающему онлайн-пользователей (как вы можете видеть в приведенном ниже коде). Но когда пользователь переходит в автономный режим, у меня нет возможности узнать об этом, и, следовательно, подоконник списка (пользователя) остается прежним. Поэтому, даже если кто-то отключится, я не смогу обновить список пользователей. Пожалуйста, помогите мне найти способ, с помощью которого я могу удалить пользователя, который не подключен (с помощью длительного опроса), и обновить список пользователей.
Я слышал, что мне нужно применить определенный тип механизма опроса к пользователю списка , поскольку событие отключения не генерируется в торнадо, в отличие от node.js. Пожалуйста, помогите мне реализовать этот механизм опроса. Ответ в коде будет очень признателен.

class OnlineHandler(BaseHandler):
    online = [] 
    identifier = [] 
    user = []
    time = []
    @tornado.web.asynchronous
    def post(self):
        random = self.get_argument("random", None)
        self.online_user(self.get_current_user(), self.retuser,random)

    def online_user(self, u, callback, random):
        cls = OnlineHandler
        if u not in cls.user:    
       cls.time.append(time.time())
       cls.user.append(u)
    else:
           index = cls.user.index(u)    
       cls.time[index] = time.time()            
        cls.online.append(callback)
        if random not in cls.identifier:                # new user connected
           cls.identifier.append(random)
           logging.info("Sending online list to %r users",len(cls.online))
           for callback in cls.online:
               try:
                   callback(cls.user)
               except:
                   logging.error("Error in online user callback", exc_info=True)
           cls.online = [] 

person Kunal Singh    schedule 12.12.2012    source источник


Ответы (1)


Я не видел, где вы удалили свой cls.user. Вот мой длинный код опроса:

class LongPollingHandler (tornado.web.RequestHandler):
@ tornado.web.asynchronous def get (self):
глобальный онлайн, count, lastcount self.connection_closed = False self.user = self.get_argument ("name" , None)
если self.user не в сети: logging.info ("user:" + self.user) online.append (self.user) http = tornado.httpclient.AsyncHTTPClient ()
appURL = self .request.protocol + ": //" + self.request.host
http.fetch (appURL + "/ internal-polling", self._on_finish)

 '''push to the client'''  
 def _on_finish(self, response):
      global online, count  ,ipollcount
      gone = self.request.connection.stream.closed()
      print (self.user +" => " + str(gone))
      if gone:
           online.remove(self.user)
           return
      self.write("welcome %s, current online number(s) %s" % (self.user, response.body))  

self.finish ()

Но у меня только что возникла ваша проблема с хостингом openshift (это нормально на моем локальном хосте, когда клиент ушел), я не знаю, находится ли торнадо за прокси, будет ли прокси отключать соединение после клиента. Я тоже ищу ответ.

person Mike Chang    schedule 22.01.2016