【问题标题】:send and receiving message using smack API使用 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);
    }





    }

}

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

谢谢

【问题讨论】:

    标签: java xmpp openfire smack


    【解决方案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
    

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

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

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

    【讨论】:

      【解决方案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

        【讨论】:

          猜你喜欢
          • 2016-02-06
          • 2014-02-07
          • 2016-09-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多