使用 Java Smack API 发送和接收消息不适用于示例
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/21195402/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Sending and receiving message using Java Smack API not working on example
提问by Flame_Phoenix
I am still trying to learn how to properly work with the java Smack API, so I followed a mini-tutorial in a java programming forum here:
我仍在努力学习如何正确使用 java Smack API,所以我在 java 编程论坛中遵循了一个迷你教程:
I then changed the code to my needs. The code is posted below:
然后我根据我的需要更改了代码。代码贴在下面:
import java.util.*;
import java.io.*;
import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;
public class JabberSmackAPI implements MessageListener{
private XMPPConnection connection;
public void login(String userName, String password) throws XMPPException
{
ConnectionConfiguration config = new ConnectionConfiguration("localhost", 5222);
connection = new XMPPConnection(config);
connection.connect();
connection.login(userName, password);
}
public void sendMessage(String message, String to) throws XMPPException
{
Chat chat = connection.getChatManager().createChat(to, this);
chat.sendMessage(message);
}
public void displayBuddyList()
{
Roster roster = connection.getRoster();
Collection<RosterEntry> entries = roster.getEntries();
System.out.println("\n\n" + entries.size() + " buddy(ies):");
for(RosterEntry r:entries)
{
System.out.println(r.getUser());
}
}
public void disconnect()
{
connection.disconnect();
}
public void processMessage(Chat chat, Message message)
{
System.out.println("Received something: " + message.getBody());
if(message.getType() == Message.Type.chat)
System.out.println(chat.getParticipant() + " says: " + message.getBody());
}
public static void main(String args[]) throws XMPPException, IOException
{
// declare variables
JabberSmackAPI c = new JabberSmackAPI();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String msg;
// turn on the enhanced debugger
XMPPConnection.DEBUG_ENABLED = true;
// Enter your login information here
System.out.println("-----");
System.out.println("Login information:");
System.out.print("username: ");
String login_username = br.readLine();
System.out.print("password: ");
String login_pass = br.readLine();
c.login(login_username, login_pass);
c.displayBuddyList();
System.out.println("-----");
System.out.println("Who do you want to talk to? - Type contacts full email address:");
String talkTo = br.readLine();
System.out.println("-----");
System.out.println("All messages will be sent to " + talkTo);
System.out.println("Enter your message in the console:");
System.out.println("-----\n");
while( !(msg=br.readLine()).equals("bye"))
{
c.sendMessage(msg, talkTo);
}
c.disconnect();
System.exit(0);
}
}
In order to run this code, I have the following setup:
为了运行此代码,我进行了以下设置:
- An Openfire server running, with two users: admin and user1.
- I enabled all the ports Openfire should require to work as well
- Eclipse IDE, when the code sample.
- 运行 Openfire 服务器,有两个用户:admin 和 user1。
- 我启用了 Openfire 工作所需的所有端口
- Eclipse IDE,当代码示例。
To run this sample, I run it using Eclipse IDE. I run this application 2 times. First I login with the admin user, and I say I want to contact with [email protected]. Then I run the sample again, as user1, and I say I want to contact with [email protected].
为了运行这个示例,我使用 Eclipse IDE 运行它。我运行这个应用程序 2 次。首先我用admin用户登录,我说我想联系[email protected]。然后我再次运行示例,作为用户 1,我说我想联系 [email protected]。
I have the two samples running at the same time. I can write messages, but the console in the other end never seems to be receiving anything. What am I doing wrong?
我有两个样本同时运行。我可以写消息,但另一端的控制台似乎从未收到任何消息。我究竟做错了什么?
I have also checked other similar posts:
我还检查了其他类似的帖子:
- send and receiving message using smack API
- Unable to display received messages with SMACK api in JAVA
However, they are also for specific cases and do not seem to help me, as I would like to have this sample running properly. What am I doing wrong?
但是,它们也适用于特定情况,似乎对我没有帮助,因为我希望此示例正常运行。我究竟做错了什么?
采纳答案by Chathura Wijesinghe
@Flame_Phoenix your sample code is working, I checked with my ejabberd server. I modified the code
@Flame_Phoenix 你的示例代码正在运行,我检查了我的 ejabberd 服务器。我修改了代码
Make sure that you added these libraries
确保您添加了这些库
- httpclient-4.1.3.jar
- httpcore-4.1.4.jar
- jstun.jar
- xpp3-1.1.4c.jar
- httpclient-4.1.3.jar
- httpcore-4.1.4.jar
- jstun.jar
- xpp3-1.1.4c.jar
versions might be changed
版本可能会改变
import java.util.*;
import java.io.*;
import org.jivesoftware.smack.Chat;
import org.jivesoftware.smack.ConnectionConfiguration;
import org.jivesoftware.smack.MessageListener;
import org.jivesoftware.smack.Roster;
import org.jivesoftware.smack.RosterEntry;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.util.StringUtils;
public class JabberSmackAPI implements MessageListener {
private XMPPConnection connection;
private final String mHost = "yourserver.com"; // server IP address or the
// host
public void login(String userName, String password) throws XMPPException {
String service = StringUtils.parseServer(userName);
String user_name = StringUtils.parseName(userName);
ConnectionConfiguration config = new ConnectionConfiguration(mHost,
5222, service);
config.setSendPresence(true);
config.setDebuggerEnabled(false);
connection = new XMPPConnection(config);
connection.connect();
connection.login(user_name, password);
}
public void sendMessage(String message, String to) throws XMPPException {
Chat chat = connection.getChatManager().createChat(to, this);
chat.sendMessage(message);
}
public void displayBuddyList() {
Roster roster = connection.getRoster();
Collection<RosterEntry> entries = roster.getEntries();
System.out.println("\n\n" + entries.size() + " buddy(ies):");
for (RosterEntry r : entries) {
System.out.println(r.getUser());
}
}
public void disconnect() {
connection.disconnect();
}
public void processMessage(Chat chat, Message message) {
System.out.println("Received something: " + message.getBody());
if (message.getType() == Message.Type.chat)
System.out.println(chat.getParticipant() + " says: "
+ message.getBody());
}
public static void main(String args[]) throws XMPPException, IOException {
// declare variables
JabberSmackAPI c = new JabberSmackAPI();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String msg;
// turn on the enhanced debugger
XMPPConnection.DEBUG_ENABLED = true;
// Enter your login information here
System.out.println("-----");
System.out.println("Login information:");
System.out.print("username: ");
String login_username = br.readLine();
System.out.print("password: ");
String login_pass = br.readLine();
c.login(login_username, login_pass);
c.displayBuddyList();
System.out.println("-----");
System.out
.println("Who do you want to talk to? - Type contacts full email address:");
String talkTo = br.readLine();
System.out.println("-----");
System.out.println("All messages will be sent to " + talkTo);
System.out.println("Enter your message in the console:");
System.out.println("-----\n");
while (!(msg = br.readLine()).equals("bye")) {
c.sendMessage(msg, talkTo);
}
c.disconnect();
System.exit(0);
}
}
回答by Deepak Kumar
I tried the example with only smack and smackx added in my dependency of pom and it is working fine.
我尝试了在我的 pom 依赖项中仅添加 smack 和 smackx 的示例,并且它工作正常。
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smack</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>org.igniterealtime.smack</groupId>
<artifactId>smackx</artifactId>
<version>3.3.1</version>
</dependency>
For this you will need to add one repository too
为此,您还需要添加一个存储库
<repository>
<id>nexus.opencastProject.org</id>
<url>http://repository.opencastproject.org/nexus/content/repositories/public</url>
<name>Opencast Nexus All Public Project Repository</name>
</repository>
Hope this helps.
希望这可以帮助。
回答by Kyle
For Smack 4.1, the MessageListener interface became ChatMessageListener. MessageListener still exists, but it has a different interface contract (processMessage takes only a Message, not a Chat).
对于 Smack 4.1,MessageListener 接口变成了 ChatMessageListener。MessageListener 仍然存在,但它有一个不同的接口契约(processMessage 只接受一个 Message,而不是一个 Chat)。