Я создаю приложение для 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».
Спасибо. Я попробую –
Большое спасибо. используя setTimeout сделал это. Поэтому, похоже, мое имя для обработчика _onOpened_ действительно не подходит. :) _onOpen_ - лучшее имя. когда он называется, канал не готов. –