我按照我可以找到的用于制作Cometd java客户端应用程序的示例。我试图这样做,当用户按下屏幕上的按钮时,cometd会向服务器发布一条消息。现在,发布被调用,但服务器永远不会收到消息给它的监听器。我有这个服务器监听器使用javascript而不是java代码。
客户端设置如下:
// 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 :(得分:0)
事实证明,我在Androids主UI线程上运行网络,CometD代码,这是不允许的。一旦我将所有的cometd代码移动到AsyncTask,它就会一直开始工作。