Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Smack聊天创建两个线程_Java_Smack - Fatal编程技术网

Java Smack聊天创建两个线程

Java Smack聊天创建两个线程,java,smack,Java,Smack,在Smack messaging library for Java中建立正确的聊天时遇到问题。如果聊天是在本地启动的,它就可以正常工作,但是如果聊天是从另一个客户端启动的,那么会创建两个不同的聊天线程,而不仅仅是需要的一个。我发送信息的代码如下: public void sendMessage(String input) throws XMPPException { Chat chat = connection.getChatManager().getThreadCha

在Smack messaging library for 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);
    }
下面是我的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(聊天室,监听器),我希望消息到达这个实例。但在阅读了手册的
传入连接
部分后,我意识到了正确的方法。