【问题标题】:Smack chats creating two threadsSmack 聊天创建两个线程
【发布时间】:2013-03-17 16:22:40
【问题描述】:

我无法在 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 中找到聊天对象有任何指示?

【问题讨论】:

    标签: java smack


    【解决方案1】:

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

    顺便说一句,您正在按线程查找现有聊天,但这不是传入聊天的线程 ID。您显示的代码 sn-p 只会匹配您自己创建的聊天,因此每次要发送消息时都设置消息侦听器没有意义,您还不如保持对它的引用一旦创建。

    您必须从传入聊天中检索线程 id 才能正常工作,这是假设传入聊天实际上有一个聊天 id。

    【讨论】:

    • 我在代码中有 ChatManagerListener,可能我应该在问题中提到但它就在那里。我知道我的 getThreadChat() 调用存在问题,但我一直无法找到更好的解决方案。我已经查看了您提到的 getUserChat() 调用,但没有找到有关它的信息,据我所知,它不在文档中。这是来自 ChatManager 的电话吗?不幸的是,我没有任何通过 JID 获取聊天的选项。
    • 抱歉回复延迟。我有另一个项目到期,不得不转移我的工作重点以满足我的最后期限。您的回答所建议的大部分内容我已经在我的代码中实现了,但您的建议是正确的。我没有正确持有对我的聊天线程 ID 的引用。现在似乎工作得很好,每个聊天都由一个线程 ID 生活。谢谢您的帮助! :)
    • 我有类似的问题。我遇到的问题是我像这样打开聊天:this.connection.getChatManager().createChat(chatroom, listener);,我期待消息到达这个实例。但是在阅读手册Incoming connections 部分后,我意识到了正确的方法。
    猜你喜欢
    • 2011-12-05
    • 2011-04-12
    • 1970-01-01
    • 2013-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多