Я следил за примерами, которые я мог найти для создания клиентского приложения 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);
}
}
}
}
Так что я могу установить соединение, и мое публикация вызывается, но сервер никогда не подбирает его. Также я заметил, что если я сделаю то же самое, что бы опубликовать, но в моем рукопожатии или подключить обратный вызов, сервер подберет его. Похоже, я просто не могу публиковать вне обратных вызовов.
Благодарим за помощь.
Извините, но ваш вопрос не заполнен. Он не показывает, где установлено '_connection_established', а не то, что инициализируется' _clientSessionChannel'. Это может быть так, что первое никогда не устанавливается в true, или последнее инициализируется неправильным именем канала и т. Д. Если вы публикуете работу из других мест, это означает, что сам CometD отлично работает, и проблема в вашем коде. – sbordet
Ваши жалобы недействительны для ответа на вопрос, я заявил, что _clientSessionChannel.publish (data); получает вызов, поэтому вам не нужно беспокоиться о _connection_established и о том, что _clientSessionChannel работает в определенные моменты времени, поэтому это действительно так. Оказалось, что я пытался запустить сетевой код в основном потоке пользовательского интерфейса, и это запрещено в Android. –