【问题标题】:Sending and receiving message using Java Smack API not working on example使用 Java Smack API 发送和接收消息不起作用示例
【发布时间】:2014-02-07 08:15:58
【问题描述】:

我仍在尝试学习如何正确使用 java Smack API,因此我在此处的 java 编程论坛中遵循了一个迷你教程:

然后我根据需要更改了代码。代码贴在下面:

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

}

为了运行此代码,我有以下设置:

  1. Openfire 服务器正在运行,有两个用户:admin 和 user1。
  2. 我启用了 Openfire 所需的所有端口也可以正常工作
  3. Eclipse IDE,当代码示例。

为了运行这个示例,我使用 Eclipse IDE 运行它。我运行这个应用程序 2 次。首先,我使用管理员用户登录,我说我想与 user1@openfire.com 联系。然后我再次以 user1 身份运行示例,我说我想联系 admin@openfire.com。

我有两个样本同时运行。我可以写消息,但另一端的控制台似乎从来没有收到任何东西。我做错了什么?

我也查过其他类似的帖子:

但是,它们也适用于特定情况,似乎对我没有帮助,因为我希望此示例正常运行。我做错了什么?

【问题讨论】:

  • 根据你的例子,不要使用“localhost”作为主机
  • 你最终解决了这个问题吗?
  • 我在 smack 4.1.1 中应用了相同的代码,但给了我很多错误......有人可以帮忙吗?

标签: java eclipse xmpp smack


【解决方案1】:

@Flame_Phoenix 您的示例代码正在运行,我检查了我的 ejabberd 服务器。我修改了代码

确保您添加了这些库

  • httpclient-4.1.3.jar
  • httpcore-4.1.4.jar
  • jstun.jar
  • xpp3-1.1.4c.jar

版本可能会改变

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

}

【讨论】:

  • 我有以下 jars:smack.jar、smackx.jar、smackx-debug.jar、smackx-jingle.jar。它们不应该包含您提到的那些吗?
  • 可能是 smack.jar 里面的那些,你有没有得到任何错误?
  • 您不需要包含任何额外的罐子。不需要提到的前两个,因为连接不是基于 http 的,另外两个已经滚动到 smack jar 中。
【解决方案2】:

我尝试了这个例子,只在我的 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>

为此,您也需要添加一个存储库

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

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    对于 Smack 4.1,MessageListener 接口变为 ChatMessageListener。 MessageListener 仍然存在,但它有一个不同的接口协定(processMessage 只接受一个消息,而不是一个聊天)。

    【讨论】:

      猜你喜欢
      • 2013-08-27
      • 2016-02-06
      • 2016-10-26
      • 2015-10-11
      • 2017-06-18
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多