gpt4 book ai didi

chat - Tornado 长轮询聊天中的断开连接事件

转载 作者:行者123 更新时间:2023-12-01 05:25:56 26 4
gpt4 key购买 nike

我正在开发一个在后端使用 Tornado 的聊天应用程序。我使用长轮询来获取在线用户的数量和服务器上可用的任何新聊天消息。我已经打开了两个与服务器的长轮询连接。

虽然很容易检测到用户何时上线。
我编写了这个类,它维护了一个在线用户的列表(用户)。
此列表很容易发送给任何请求在线用户的客户端(如下面的代码所示。)
但是当用户离线时,我无法知道这一点,因此列表(用户)仍然保持不变。因此,即使有人下线,我也无法更新用户列表。
请帮我找出一种方法来删除未连接的用户(使用长轮询)并更新用户列表。
我听说我必须对列表用户应用某种轮询机制,因为与 node.js 不同,tornado 中不会生成断开连接事件。
请帮我实现那个轮询机制。代码中的响应将不胜感激。

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 = []

最佳答案

我看不到你在哪里删除了 cls.user。以下是我的长轮询代码:

类 LongPollingHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous
定义获取(自我):
全局在线,计数,最后计数
self.connection_closed = False
self.user = self.get_argument("name", None)
如果 self.user 不在线:
logging.info("用户:"+ 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 的托管上遇到了您的问题(客户端不在时在我的本地主机上没问题),我不知道 Tornado 是否在代理后面,代理是否会切断客户端后面的连接。我也在寻求答案。

关于chat - Tornado 长轮询聊天中的断开连接事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13840646/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com