如何在没有轮询的情况下向客户端发送消息?

时间:2010-10-03 17:54:41

标签: google-app-engine chat

GAE Chats的每个示例都使用某种轮询。但是,如果我的GAE应用程序包含客户端列表(必要时在数据存储区中),也许我可以通过向所有这些客户端发送消息来避免轮询。我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:6)

如果您在谈论HTTP,简短的回答是GAE目前不支持它。我认为你所问的有时被称为BOSH。一旦WebSockets变得更加普及,它们将成为解决此问题的绝佳解决方案。

与此同时,您可能需要查看XMPP。使用XMPP可以避免轮询。谷歌已宣布Channel API(尚未发布),它基本上会为您提供与websockets相同的功能。

答案 1 :(得分:2)

您可能已经看过一些聊天室示例......

由于您只想向数据存储区上的用户发送消息(提示:IMProperty非常适合存储此类数据),只需直接发送消息即可:

from google.appengine.api import xmpp
# `destination` is a list of JIDS
# `message` is a normal unicode string
xmpp.send_message(destination, message)

你可以找到关于尼克约翰逊使用XMPP的精彩教程here

答案 2 :(得分:0)

请注意,您现在可以使用App Engine渠道API:http://code.google.com/appengine/docs/python/channel/

您可以使用以下方式为给定客户创建频道:

channel.create_channel(client_id)

然后,当您想要更新该客户端时,请发送消息:

channel.send_message(client_id, message)

基本上每个客户端都会获得一个可以推送消息的持久连接。