4

まず、非常に便利な API を提供してくれた @Moishe に感謝します。少しタイムアウトの問題があります。誰かが答えを知っているかもしれません。チャンネルを開く方法は次のとおりです。

var openChannel = function () {
    var channel = new goog.appengine.Channel($('#token').val());
    var socket = channel.open();
    socket.onopen = function () {};
    socket.onmessage = function (m) {
        var message = JSON.parse(m.data);
        // do stuff
    };
    socket.onerror = function (error) { alert(error); };
    socket.onclose = openChannel;
};
openChannel();

これは問題なく動作し、メッセージを投稿すると、メッセージは他のクライアントにすぐに届きます。しかし、約 15 分間ページに留まると、サーバーは私のチャンネルを追跡できなくなります。開発環境では、エラーがスローされます (これは既知のバグでした: http://www.mail-archive.com/google-appengine@googlegroups.com/msg44609.html )。しかし、prod では、約 15 分後にそのチャネルのメッセージを無視します。

ページにを追加して修正しましたsetInterval(getSomeUrl, everyMinute)が、そうする必要はありません。Moishe のトリビア ゲーム サンプルの最後のコミットで、彼がキープアライブを実行していることに気付きました。彼がどのようにそれを置き換えたのか理解できませんでした.onopenの意味は信頼できます:

http://code.google.com/p/trivia-quiz/source/browse/trunk/src/index.html

更新:サーバー側のコードは

class Home(BaseHandler):
    def get(self):
        self.checkUser()

        if self.user:
            userId = self.user.user_id()
            token = channel.create_channel(userId)
            chatClients[userId] = token
            self.model['token'] = token
            players = self.checkChatRoom()
            self.model['users'] = players
            self.model['messages'] = map(lambda k:db.get(k), self.chat_room.messages) # TODO: Replace this line and the next with a query
            self.model['messages'] = sorted(self.model['messages'], key=lambda m: m.timestamp, reverse=True)
            self.writeTemplate('index.html')

BaseHandlerは、私がすべての GAE ハンドラーに使用する単なる基本クラスでcheckUserあり、ユーザーがログインしていない場合にリダイレクトするものを提供し、内容を取得してテンプレートに書き込むwriteTemplateものを提供します。self.modelこれは単なる概念実証であるため、キャッシュや上記以外のものはありません。

4

0 に答える 0