【问题标题】:Checking client presence using Channel使用 Channel 检查客户端的存在
【发布时间】:2011-10-19 08:36:30
【问题描述】:
我目前正在为我的一个课程项目在 Google App Engine 上开发一个应用程序,现在我正在尝试设计一个侧面板,当有人登录并连接到我的应用程序时它会自行更新。目的是让其他用户看到谁在线,这样他们就可以在游戏中互相挑战(是的,我正在写一个游戏应用程序)。我设法通过使用 Channel API、启用通道存在和实现处理程序来做到这一点。它运行良好,但仅当我停留在一个页面上并且有人登录时才有效。当我转到另一个页面时,我无法检查该用户是否仍处于连接状态。该列表仅在有人连接时更新,但不会显示当前连接的用户。
有没有一种方法可以检查哪些用户使用 GAE 的频道进行了连接?我注意到当我的应用程序尝试将 ChannelMessage 发送到当前未连接的 clientId 时,会打印一条警告消息。 Channel API 中有什么东西可以让我做同样的事情吗?
【问题讨论】:
标签:
google-app-engine
channel-api
【解决方案1】:
听起来你要求的是像 channel.enumerate_connected_clients() 这样的方法。
没有这样的事情。您需要使用数据存储和/或 memcache 自己跟踪它。如果你只使用数据存储,你可以这样做:
定义你的模型:
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
现在在您的连接或断开处理程序中,更新“已连接”属性:
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.
枚举您的客户实体并显示它们是留给读者的练习。就像动态更新现有客户的列表一样。