2013-07-11 3 views
0

Я следил за примерами, которые я мог найти для создания клиентского приложения Cometd java. Я пытаюсь сделать это, когда пользователь нажимает кнопку на экране, cometd публикует сообщение на сервер. Прямо сейчас публикация вызывается, но сервер никогда не получает сообщение своему слушателю. У меня есть этот прослушиватель сервера, работающий с javascript, но не с java-кодом.Cometd Java Client не будет публиковать на Cometd-сервере

установки на стороне клиента выглядит следующим образом:

 // Prepare the transport 
     Map<String, Object> options = new HashMap<String, Object>(); 
     ClientTransport transport = LongPollingTransport.create(options, httpClient); 

     _client = new BayeuxClient("http://10.100.97.168:8888/slideshow/slideshow/", transport); 
     _client.getChannel(Channel.META_HANDSHAKE).addListener(new InitializerListener()); 
     _client.getChannel(Channel.META_CONNECT).addListener(new ConnectionListener()); 

Мои рукопожатия и подключение слушателей:

private class InitializerListener implements ClientSessionChannel.MessageListener 
    { 
     public void onMessage(ClientSessionChannel channel, Message message) 
     { 
      if (message.isSuccessful()) 
      { 
       _handshaked = true; 
      } 
      else 
      { 
       _handshaked = false; 
      } 
     } 
    } 

    private class ConnectionListener implements ClientSessionChannel.MessageListener 
    { 
     private boolean wasConnected; 
     private boolean connected; 

     public void onMessage(ClientSessionChannel channel, Message message) 
     { 
      if (_client.isDisconnected()) 
      { 
       connected = false; 
       connectionClosed(); 
       return; 
      } 

      wasConnected = connected; 
      connected = message.isSuccessful(); 
      if (!wasConnected && connected) 
      { 
       connectionEstablished(); 
      } 
      else if (wasConnected && !connected) 
      { 
       connectionBroken(); 
      } 
     } 
    } 

Кнопка пресса, которая пытается опубликовать:

_btnPlay.setOnClickListener(new OnClickListener() { 
      public void onClick(View v) { 
       if(_connection_established == true) 
       { 
        Map<String, Object> data = new HashMap<String, Object>(); 
        _clientSessionChannel.publish(data); 
       } 
      } 
     }); 

Только в случае здесь мой сервер Слушатель тоже:

@Listener("/service/slide/play") 
    public void processServiceSlidePlay(ServerSession client, ServerMessage message) 
    { 
     synchronized(imagelock) 
     { 
      if(slideShowRunning == false && imageIDList != null && imageIDList.size() > 0) 
      { 
       slideShowRunning = true; 
       if(imageIDList != null && imageIDList.size() > 0) 
       {   
        deliverChangeMessage(client, message); 
       } 
      } 
     } 
    } 

Так что я могу установить соединение, и мое публикация вызывается, но сервер никогда не подбирает его. Также я заметил, что если я сделаю то же самое, что бы опубликовать, но в моем рукопожатии или подключить обратный вызов, сервер подберет его. Похоже, я просто не могу публиковать вне обратных вызовов.

Благодарим за помощь.

+0

Извините, но ваш вопрос не заполнен. Он не показывает, где установлено '_connection_established', а не то, что инициализируется' _clientSessionChannel'. Это может быть так, что первое никогда не устанавливается в true, или последнее инициализируется неправильным именем канала и т. Д. Если вы публикуете работу из других мест, это означает, что сам CometD отлично работает, и проблема в вашем коде. – sbordet

+0

Ваши жалобы недействительны для ответа на вопрос, я заявил, что _clientSessionChannel.publish (data); получает вызов, поэтому вам не нужно беспокоиться о _connection_established и о том, что _clientSessionChannel работает в определенные моменты времени, поэтому это действительно так. Оказалось, что я пытался запустить сетевой код в основном потоке пользовательского интерфейса, и это запрещено в Android. –

ответ

0

Оказалось, что я управляю сетью, кодом cometD, на главной теме андроидов, и это недопустимо. Как только я переместил весь код cometd в AsyncTask, все это все время работало.

+0

Привет, Майкл, Вы используете eclipse для своего развития. Я не могу настроить свой проект андроида на использование java-клиента cometd. Я продолжаю получать исключение NoClassDefFound для косвенных зависимостей. –