我目前正在Google App Engine上为我的一个课程项目开发一个应用程序,现在我正试图想出一个侧面板,只要有人登录并连接到我的应用程序,它就会自动更新。目的是让其他用户看到谁在线,这样他们就可以在游戏中互相挑战(是的,我正在编写游戏应用程序)。我设法通过使用Channel API,启用频道存在和实现处理程序来实现此目的。它工作得很好,但只有当我留在页面上并且有人登录时它才有效。当我移动到另一个页面时,我无法检查该用户是否仍然连接。该列表仅在有人连接时更新,但不会显示当前连接的用户。
有没有办法可以使用GAE频道查看哪些用户已连接?我注意到当我的应用程序尝试将ChannelMessage发送到当前未连接的clientId时,会打印一条警告消息。 Channel API中有什么东西可以让我做同样的事情吗?
答案 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.
枚举您的客户实体并显示它们是留给读者的练习。正如动态更新现有客户的列表一样。