Проверка присутствия клиента с помощью канала - PullRequest
1 голос
/ 19 октября 2011

В настоящее время я разрабатываю приложение на Google App Engine для одного из моих курсовых проектов и сейчас пытаюсь придумать боковую панель, которая будет обновляться при каждом входе в систему и подключении к моему приложению. Цель состоит в том, чтобы позволить другим пользователям видеть, кто находится в сети, чтобы они могли соревноваться друг с другом в игре (да, я пишу игровое приложение). Мне удалось сделать это с помощью Channel API, обеспечивающего присутствие канала и реализующего обработчики. Он работает отлично, но работает только тогда, когда я остаюсь на странице и кто-то входит в систему. Когда я перехожу на другую страницу, у меня нет возможности проверить, подключен ли этот пользователь. Список обновляется только когда кто-то подключается к нему, но не будет отображать пользователей, которые в данный момент подключены.

Есть ли способ проверить, какие пользователи подключены по каналу GAE? Я заметил, что предупреждающее сообщение печатается, когда мое приложение пытается отправить ChannelMessage на clientId, который в данный момент не подключен. Есть ли в Channel API что-нибудь, что может позволить мне сделать то же самое?

1 Ответ

2 голосов
/ 19 октября 2011

Звучит так, будто вы запрашиваете такой метод, как 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

Теперь в вашем обработчике соединения или разъединения обновите свойство '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.

Перечисление ваших клиентских сущностей и их отображение - упражнение, оставленное читателю.Как динамически обновляется список для существующих клиентов.

...