9

我已经用两个用户 testuser1 和 testuser2 在本地机器上设置了我的 open fire(jabber 服务器)。使用 Spark 客户端,两个用户都可以毫无问题地进行聊天,这很好。

开火IP -192.168.1.65

我想使用 smack API(3.3.0) 发送和接收消息。我已经编写了发送方代码来发送消息(使用 testuser1)并使用在 testuser2 端接收到的 Spark 客户端(使用 testuser2)消息进行了测试,但是当我尝试使用 java 代码接收发送方消息时,我无法接收那些发布消息。

发件人.java

import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.MessageListener;

public class Sender 
{

    public static void main(String a[]) throws XMPPException, InterruptedException
    {
         XMPPConnection connection = new XMPPConnection("192.168.1.65");  
         System.out.println(connection);
         connection.connect();
         connection.login("testuser1", "test123");



         Chat chat = connection.getChatManager().createChat("testuser2@sameek", new MessageListener() {

             public void processMessage(Chat chat, Message message) {
                 // Print out any messages we get back to standard out.
                 System.out.println("Received message: " + message);
             }
         });
         chat.sendMessage("Howdy test1!");

         while (true) {
        Thread.sleep(50);
    }





    }

}

接收器.java

  import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.MessageListener;






public class Receiver
{

    public static void main(String a[]) throws XMPPException,, InterruptedException
    {
         XMPPConnection connection = new XMPPConnection("192.168.1.65");  
         System.out.println(connection);
         connection.connect();
         connection.login("testuser2", "test123");



         Chat chat = connection.getChatManager().createChat("testuser1@sameek", new MessageListener() {

             public void processMessage(Chat chat, Message message) {
                 // Print out any messages we get back to standard out.
                 System.out.println("Received message: " + message);
             }
         });
         chat.sendMessage("Howdy test2!");

         while (true) {
        Thread.sleep(50);
    }





    }

}

请帮助我并建议我是否遵循错误的方法。

谢谢

4

3 回答 3

17

在按照此处的教程(http://www.javacodegeeks.com/2010/09/xmpp-im-with-smack-for-java.html)之后,我遇到了类似的问题,这就是我发现的:

当您创建聊天时,您与您想要连接的用户聊天(例如,在我的例子中是“user1@gbd038”)。如果 user1 使用的是诸如 Spark 之类的 GUI 客户端(可能对此具有内置支持和/或错误处理),则此方法可以正常工作,并且 user1 将收到该消息。此过程将 messageListener 附加到现在与“user1@gbd038”关联的聊天。但是,当我以 user1 身份从 Spark 回复时,smack 收到的聊天实际上是通过位置标签完成的,例如:

Received message 'hi' from user1@gbd038/Spark 2.6.3

因此,它会创建一个应用程序未侦听的新聊天(因此您的应用程序将不会接收/打印输出)。我找到了两种方法来解决这个问题:

  1. 在开始对话时使用位置标签(尽管这似乎不是非常可扩展或健壮):

    xmppManager.sendMessage("Hello mate", "user1@gbd038/Spark 2.6.3");

  2. 正如 Robin 建议的那样,使用 ChatManagerListener(它会在收到 user1 的回复时创建一个新的聊天,可以转发给 messageListener):

    chatManager = connection.getChatManager();
    messageListener = new MyMessageListener();
    
    chatManagerListener = new ChatManagerListener() {
        @Override
        public void chatCreated(Chat chat, boolean createdLocally) {
            chat.addMessageListener(messageListener);
        }
    };
    chatManager.addChatListener(chatManagerListener);
    

希望对处于相同位置的人有所帮助!

于 2014-01-14T16:33:37.527 回答
2

您正在创建一个聊天并从两端发送聊天消息,但没有收听来自任何一方的聊天。使用 ChatManagerListener 侦听来自其他客户端的传入聊天。

于 2013-08-28T20:05:13.690 回答
1

使用以下代码发送和接收消息

@Override
         public void processMessage(Chat chat, Message message) {
             // Print out any messages we get back to standard out.
             System.out.println("Received message: " + message);
         }

     });

chat.sendMessage("How are you dear !!");
System.out.println(" Send Message succesfully");

有关完整代码示例,请访问如何使用 smack api 发送消息

于 2017-10-04T07:53:52.943 回答