使用 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