使用smack API发送和接收消息

我已经在本地机器上设置了我的开放式火灾(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); } } } 

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

谢谢

我有一个类似的问题,按照这里的教程( http://www.javacodegeeks.com/2010/09/xmpp-im-with-smack-for-java.html ),这是我发现的:

创建聊天时,您可以聊聊要连接的用户(例如,在我的情况下为“user1 @ gbd038”)。 如果user1正在使用诸如Spark之类的GUI客户端(可能具有内置支持和/或error handling),并且user1将接收该消息,则这可以正常工作。 此过程将messageListener附加到现在与“user1 @ gbd038”关联的聊天中。 但是,当我作为user1从Spark回复时,smack收到的聊天实际上是通过location标记完成的,例如:

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

希望能帮助某人处于同一位置!

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

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

 @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发送消息