在Java的Smack消息传递库中建立适当的聊天时遇到了问题。如果聊天是在本地启动的,它工作得很好,但是如果聊天是从另一个客户端启动的,那么就会创建两个不同的聊天线程,而不仅仅是需要的一个。我发送消息的代码如下:
public void sendMessage(String input) throws XMPPException
{
Chat chat = connection.getChatManager().getThreadChat("test@server");
if(chat != null)
{
System.out.println("Chat exists!");
chat.addMessageListener(messageListener);
}
else
{
System.out.println("Create new chat");
chat = connection.getChatManager().createChat("test@server", "test@server", messageListener);
System.out.println(chat.getThreadID());
}
chat.sendMessage(input);
}
下面是处理传入消息的侦听器类。它最初是在程序初始化时设置的,以便在登录后可以直接接收消息,并建立聊天。您可以在上面看到的sendMessage
函数中的messageListener
变量也可以调用它。
class MyMessageListener implements MessageListener {
@Override
public void processMessage(Chat chat, Message message) {
String from = message.getFrom();
String body = message.getBody();
System.out.println(chat.getThreadID());
System.out.println(String.format("Received message '%1$s' from %2$s", body, from));
}
}
我是Smack库的新手,发现可用的文档和示例有点模糊。任何人都有任何指针,我如何检查聊天是否在另一个客户端上创建,并以某种方式获取此聊天的线程ID或通过知道发送消息的用户名称从ChatManager找到聊天对象?
您需要注册一个ChatManagerListener来侦听传入的聊天,如文档中的传入聊天一节所述。以这种方式创建的聊天中的侦听器将接收传入消息,假设它们使用相同的线程id响应(并非所有客户端都使用线程id)。
顺便说一下,您正在通过线程查找现有的聊天,但这不是传入聊天的线程id。您所显示的代码片段将只与您自己创建的聊天匹配,因此在每次发送消息时设置消息侦听器是没有意义的,您不妨在创建消息后保留对它的引用。
您必须从传入的聊天中检索线程id才能正常工作,这是假设传入的聊天实际上有一个聊天id。