首先,感谢@Moishe 提供了非常有用的 API。我有一点超时问题,也许有人知道答案。这是我打开频道的方法:
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 分钟后它仍然会忽略该频道上的消息。
我们通过向页面添加 a 来修复它setInterval(getSomeUrl, everyMinute)
,但我们宁愿不必这样做。我注意到在 Moishe 对琐事游戏示例的最后一次提交中,他取出了一个 keep-alive。没看懂他是怎么换的,他说的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
并将其写入模板的内容。这只是一个概念证明,所以除了上面的内容之外没有缓存或其他任何东西。