Ошибка сообщения в канале API

Я запускаю веб-приложение gae на локальном хосте. Я успешно сгенерировал токен из goog.channel и отправил его клиенту. Где клиент может принять токен и пытается открыть соединение. Проблема в том, что я отправляю сообщение из своего класса сервлета, и на стороне клиента ничего не происходит.

Ниже приведены мои коды:

Сторона сервера:

//for generating token 
 ChannelService channelService=ChannelServiceFactory.getChannelService();
                    token = channelService.createChannel(userid);
//for sending message
ChannelService channelService=ChannelServiceFactory.getChannelService();
            channelService.sendMessage(new ChannelMessage(userid, message));

    //in appengine-web.xml
     <inbound-services>
            <service>channel_presence</service>
      </inbound-services>

Javascript:

function getToken(){                        
        var xmlhttpreq=new XMLHttpRequest();            
        xmlhttpreq.open('GET',host+'/channelapi_token?q='+user,false);
        xmlhttpreq.send();
        xmlhttpreq.onreadystatechange=alert(xmlhttpreq.responseText);
        token=xmlhttpreq.responseText;
        setChannel();
}

function setChannel(){
        alert(token);//iam receiving right token here
        channel=new goog.appengine.Channel(token);
        socket=channel.open();
        socket.open=alert('socket opened');//this message alerts
        socket.onmessage=alert('socket onmessage');//this message alerts
        socket.onerror=alert('socket onerror');//this message alerts
        socket.onclose=alert('socket onclose');//this message alerts
}

Исключений при отправке сообщения из ChannelService нет. Также клиентская сторона повторно делает запрос на получение на мой сервер:

http://localhost:8888/_ah/channel/[email protected]&client=connection-3

Что здесь не так? Заранее спасибо.


person Vivek Mohan    schedule 26.01.2012    source источник


Ответы (1)


Вы вызываете alert(...) и назначаете возвращаемое значение вашим обработчикам сообщений. Вместо этого вы должны назначить функцию этим обработчикам:

    socket.onopen = function() {
      alert('socket opened');
    };
    // etc
    // Note that message takes a parameter:
    socket.onmessage = function(evt) {
      alert('got message: ' + evt.data);
    };

Обратите внимание, что вы также можете сделать это следующим образом:

function onMessage(evt) {
  // do something
}

socket.onmessage = onMessage;

Обратите внимание, что вы не назначаете onMessage(), который вызовет onMessage и присвоит ему возвращаемое значение.

person Moishe Lettvin    schedule 26.01.2012
comment
Спасибо Мойше. Сейчас это работает. И причину опроса я нашел здесь: stackoverflow.com /questions/4987427/force-channel-api-to-poll - person Vivek Mohan; 27.01.2012