4

バックエンドでトルネードを使用するチャットアプリケーションに取り組んでいます。私は長いポーリングを使用して、オンラインユーザーの数とサーバーで利用可能な新しいチャットメッセージを取得しました。サーバーとの2つの長いポーリング接続を開きました。

ユーザーがオンラインになったときを検出するのは非常に簡単ですが。オンラインになったユーザーのリスト(ユーザー)を保持するこのクラスをコーディングしました。このリストは、オンラインユーザーを要求しているクライアントに簡単に送信されます(以下のコードで確認できます)。ただし、ユーザーがオフラインになっても、それを知る方法がないため、リスト(ユーザー)の敷居は同じままです。そのため、誰かがオフラインになっても、ユーザーリストを更新することはできません。接続されていないユーザーを(長いポーリングを使用して)削除し、ユーザーリストを更新する方法を見つけてください。
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