Я работаю над приложением чата, которое использует 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 = []