Java Smack聊天创建两个线程
在Smack messaging library for Java中建立正确的聊天时遇到问题。如果聊天是在本地启动的,它就可以正常工作,但是如果聊天是从另一个客户端启动的,那么会创建两个不同的聊天线程,而不仅仅是需要的一个。我发送信息的代码如下:Java Smack聊天创建两个线程,java,smack,Java,Smack,在Smack messaging library for Java中建立正确的聊天时遇到问题。如果聊天是在本地启动的,它就可以正常工作,但是如果聊天是从另一个客户端启动的,那么会创建两个不同的聊天线程,而不仅仅是需要的一个。我发送信息的代码如下: public void sendMessage(String input) throws XMPPException { Chat chat = connection.getChatManager().getThreadCha
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);
}
下面是我的listener类,它处理传入的消息。它最初是在程序初始化时设置的,以便在登录并建立聊天后可以直接接收消息。您可以在上面看到的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或从聊天室管理器中找到聊天对象吗?您需要注册一个聊天室管理器侦听器来侦听传入的聊天室,如文档中的章节所述。以这种方式创建的聊天中的侦听器将接收传入消息,假设它们使用相同的线程id进行响应(并非所有客户端都使用线程id) 顺便说一下,您正在按线程查找现有聊天,但这不是传入聊天的线程id。您显示的代码片段仅与您自己创建的聊天室匹配,因此在每次发送消息时设置消息侦听器没有意义,您也可以在创建消息后保留对它的引用
您必须从传入的聊天中检索线程id才能正常工作,这是假设传入的聊天实际上有一个聊天id。我在代码中有ChatManagerListener,可能是我应该在问题中提到的东西,但它就在那里。我知道我的getThreadChat()调用有问题,但我一直很难找到更好的解决方案。我研究了您提到的getUserChat()调用,但没有找到相关信息,而且据我所知,文档中也没有。这是聊天室经理打来的电话吗?很遗憾,我没有办法通过JID获取聊天信息。很抱歉延迟回复。我还有一个项目要完成,我不得不转移我的工作重点以满足我的最后期限。您的回答表明,我已经在代码中实现了大部分内容,但您的建议是正确的。我没有正确地保存对聊天线程ID的引用。现在似乎工作得很好,每个聊天都使用一个线程ID。感谢您的帮助!:)我也有类似的问题。我遇到的问题是,我是这样打开聊天室的:
this.connection.getChatManager().createChat(聊天室,监听器)代码>,我希望消息到达这个实例。但在阅读了手册的传入连接
部分后,我意识到了正确的方法。