使用Channel检查客户端状态

时间:2011-10-19 08:36:30

标签: google-app-engine channel-api

我目前正在Google App Engine上为我的一个课程项目开发一个应用程序,现在我正试图想出一个侧面板,只要有人登录并连接到我的应用程序,它就会自动更新。目的是让其他用户看到谁在线,这样他们就可以在游戏中互相挑战(是的,我正在编写游戏应用程序)。我设法通过使用Channel API,启用频道存在和实现处理程序来实现此目的。它工作得很好,但只有当我留在页面上并且有人登录时它才有效。当我移动到另一个页面时,我无法检查该用户是否仍然连接。该列表仅在有人连接时更新,但不会显示当前连接的用户。

有没有办法可以使用GAE频道查看哪些用户已连接?我注意到当我的应用程序尝试将ChannelMessage发送到当前未连接的clientId时,会打印一条警告消息。 Channel API中有什么东西可以让我做同样的事情吗?

1 个答案:

答案 0 :(得分:2)

听起来你所要求的是像channel.enumerate_connected_clients()这样的方法。

没有这样的事情。您需要使用数据存储区和/或内存缓存来自行跟踪它。如果您只是使用数据存储区,则可以执行以下操作:

定义您的模型:

class Client(db.Model):
  name = db.StringProperty()
  connected = db.BooleanProperty()

创建频道时创建新的客户端实体:

  # Create an entity in the database and use its key as the clientid
  client = Client(name=username, connected=False)
  client.put()
  token = channel.create_channel(str(client.key()))

  # Then pass that token down to your client

现在在您的connect或disconnect处理程序中,更新'connected'属性:

class ConnectHandler(webapp.RequestHandler):
  def post(self):
    client = Client.get(Key(self.request.get('from')))
    client.connected = True
    client.put()

# Have a similar class for DisconnectHandler, 
# or be more clever by inspecting the path.

枚举您的客户实体并显示它们是留给读者的练习。正如动态更新现有客户的列表一样。