2013-04-17 3 views
1

Я создаю приложение для GAE с использованием API-интерфейса python. It is running here. Это многопользовательская игра. Я использую API канала для передачи игрового состояния между игроками.В API-интерфейсе GAE onmessage не называется

Но в приложении движок onmessage обработчик канала не вызывается. Вызывается обработчик onopen. onerror или onclose также не называются. Странно, что это прекрасно работает на локальном сервере разработки.

Возможно ли, что что-то вроде этого может работать на сервере разработки, но не в самом устройстве приложения?

Буду действительно очень рад, если кто-то сможет изучить следующее описание моего приложения и помочь мне разобраться в том, что произошло. Спасибо.

Я просмотрел вопросы this и this, но я не сделал этих ошибок.

<script> 

     sendMessage = function(path, opt_param, opt_param2) { 

      path += '?g=' + state.game_key; 
      if (opt_param) { 
       path += '&' + opt_param; 
      } 
      if (opt_param2) { 
       path += '&' + opt_param2; 
      } 
      var xhr = new XMLHttpRequest(); 
      xhr.open('POST', path, true); 
      xhr.send(); 
     }; 

Выше функция используется для отправки запроса на сервер.

onOpened = function() { 
     sendMessage('/resp'); 
     console.log('channel opened'); 
    }; 

Выше это функция, которую я хочу вызвать, когда канал открыт в первый раз. Я отправляю сообщение на адрес '/ resp'.

onMessage = function(m) { 
    console.log('message received'); 
    message = JSON.parse(m.data); 
    //do stuff with message here 
}; 

Я хочу обработать ответ, который я получаю от этого запроса в вышеуказанной функции.

следующие операторы onerror и onclose.

onError = function() { 
     console.log('error occured'); 
     channel = new goog.appengine.Channel('{{ token }}'); 
     socket = channel.open(); 
    }; 

    onClose = function() { 
     console.log('channel closed'); 
    }; 

    channel = new goog.appengine.Channel('{{ token }}'); 
    socket = channel.open(); 
    socket.onopen = onOpened; 
    socket.onmessage = onMessage; 
    socket.onclose = onClose; 
    socket.onerror = onError; 

</script> 

Этот сценарий находится в верхней части тега тела. Это отлично работает на моем локальном сервере разработки. Но на движке приложения вызывается
функция onOpen.
Я могу видеть запрос в/resp в журналах разрыва.
, но onMessage никогда не называется. Сообщение «полученное сообщение» отсутствует в консоли.

это серверная сторона.

token = channel.create_channel(user.user_id() + game.user1.user_id()) 
url = users.create_logout_url(self.request.uri) 
template_values = { 
        'token' : token, 
        'id' : pid, 
        'game_key' : str(game.user1.user_id()), 
        'url': url 
       } 
path = os.path.join(os.path.dirname(__file__), 'game.html') 
self.response.out.write(template.render(path, template_values)) 

, и это находится в обработчике запроса для запроса '/ resp'. Мое приложение - многопользовательская карточная игра. И я хочу сообщить другим игрокам, что новый игрок подключен. Даже новосвязанный игрок также получит это сообщение.

class Responder(webapp2.RequestHandler):    
    def post(self): 
     user = users.get_current_user() 
     game = OmiGame.get_by_key_name(self.request.get('g')) 
     if game.user1: 
      channel.send_message(game.user1.user_id() + game.user1.user_id() , create_message('%s joined.' % user.nickname())) 
     if game.user2: 
      channel.send_message(game.user2.user_id() + game.user1.user_id() , create_message('%s joined.' % user.nickname())) 

EDIT: user1 является пользователь, который создал игру. Я хочу, чтобы маркеры других игроков создавались путем добавления user_id user1 и соответствующих пользователей user_id. Может, здесь что-то не так?

Так что, когда я пытаюсь это сделать на локальном dev-сервере, я получаю эти сообщения в полном порядке. Но на GAE onMessage не вызывается. This is my app. Когда нажата кнопка «Создать», страница с приведенным выше сценарием загружается и отображается «playernicknamename».

ответ

3

Поведение канала на сервере dev и его производстве несколько отличается.На сервере dev клиент канала просто часто проверяет HTTP-запросы. При производстве используется длинный опрос в кометном стиле.

Я подозреваю, что может возникнуть проблема с вызовом XHR внутри обработчика onOpened. В Chrome, по крайней мере, я вижу, что следующий запрос GET-запроса GET, используемый API-интерфейсом канала, отменяется.

Попробуйте вызвать sendMessage ('/ resp') вне функции onMessage. Возможно, запустите его, чтобы запустить его с помощью setTimeout, чтобы он вызывается позже после вашего возвращения.

+0

Спасибо. Я попробую –

+0

Большое спасибо. используя setTimeout сделал это. Поэтому, похоже, мое имя для обработчика _onOpened_ действительно не подходит. :) _onOpen_ - лучшее имя. когда он называется, канал не готов. –

Смежные вопросы