使用 smack API 发送和接收消息

Posted

技术标签:

【中文标题】使用 smack API 发送和接收消息【英文标题】:send and receiving message using smack API 【发布时间】:2013-08-27 08:30:09 【问题描述】:

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

openfire IP -192.168.1.65

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

Sender.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);
    





    


Receiver.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);
    





    


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

谢谢

【问题讨论】:

【参考方案1】:

在按照此处的教程 (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

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

    在开始对话时使用位置标签(尽管这看起来不是很可扩展或健壮):

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

    按照 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);
    

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

@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");

完整代码示例请访问How to send message using smack api

【讨论】:

以上是关于使用 smack API 发送和接收消息的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Smack API 使用 openfire 服务器发送/接收消息

使用 Smack 和 Openfire 发送/接收消息时遇到问题

无法在 JAVA 中使用 SMACK api 显示收到的消息

使用 Smack API (xmpp) 从 Java 回调 JavaFX

如何使用 Smack 4.1 创建、发送和接收 IQ 数据包

是否可以使用 Smack API 在 Openfire Server 上监听/监视用户向另一个用户发送的消息?