加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

断开龙卷风中的事件长轮询聊天

发布时间:2020-12-20 13:32:07 所属栏目:Python 来源:网络整理
导读:我正在开发一个在后端使用Tornado的聊天应用程序.我使用长轮询来获取在线用户的数量以及服务器上可用的任何新聊天消息.我已经与服务器打开了两个长轮询连接. 虽然很容易检测到用户何时上线. 我编写了这个类,它维护了一个在线用户的列表(用户). 此列表很容易
我正在开发一个在后端使用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 = []

解决方法

我看不到你删除cls.user的位置.以下是我的长轮询代码:

class LongPollingHandler(tornado.web.RequestHandler):
?????@ tornado.web.asynchronous
?????def get(self):
??????????全球在线,计数,lastcount
??????????self.connection_closed =错误
??????????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的托管上遇到了问题(当客户端消失时我的localhost就可以了),我不知道龙卷风是否在代理后面,代理是否会切断客户端之后的连接.我也在寻找答案.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读