Smack聊天创建两个线程

时间:2013-03-17 16:22:41

标签: java smack

我无法在Smack消息库中为Java建立正确的聊天。如果聊天是在本地启动的话,它可以正常工作,但如果从另一个客户端启动聊天,则会创建两个不同的聊天线程,而不仅仅是需要的聊天线程。我发送邮件的代码如下:

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);
    }

下面我有一个处理传入消息的监听器类。它最初是在程序初始化时设置的,因此可以在登录后直接接收消息,并建立聊天记录。它也可以通过您在上面看到的messageListener函数中的sendMessage变量调用。

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中查找聊天对象的任何指针?

1 个答案:

答案 0 :(得分:2)

您需要注册 ChatManagerListener 以侦听传入的聊天记录,如文档中的Incoming Chats部分所述。以这种方式创建的聊天中的侦听器将接收传入的消息,假设它们使用相同的线程ID进行响应(并非所有客户端都使用线程ID)。

顺便说一句,您正在按线程查找现有聊天,但这不是传入聊天的线程ID。您显示的代码段只会在您自己创建的聊天中匹配,因此每次要发送消息时都没有设置消息侦听器的任何意义,您也可以只在它上面引用它。是创造。

您必须从传入的聊天中检索线程ID以使其正常工作,并且假设传入的聊天实际上具有聊天ID。