4

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

虽然很容易检测到用户何时上线。我已经编写了这个类,它维护了一个上线用户的列表(用户)。该列表很容易发送给任何请求在线用户的客户端(如下面的代码所示。)但是当用户离线时,我无法知道这一点,因此列表(用户)sill 保持不变。因此,即使有人下线,我也无法更新用户列表。请帮助我找出一种方法来删除未连接的用户(使用长轮询)并更新用户列表。
我听说我必须对列表用户应用某种轮询机制,因为与 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 = [] 
4

1 回答 1

1

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

class LongPollingHandler(tornado.web.RequestHandler):
@tornado.web.asynchronous def get(self):
global online, count ,lastcount self.connection_closed = False self.user = self.get_argument("name", None)
if self.用户不在线: 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的托管上遇到了你的问题(当客户端消失时,我的本地主机上没问题),我不知道龙卷风是否在代理后面,代理是否会切断客户端之后的连接。我也在寻找答案。

于 2016-01-22T14:12:29.107 回答