我在代码中尽可能简单地做到了这一点。我在 8-0.8.3 版中为 android 使用 asmack 库。

我的代码:

package info.zajacmp3.servercommunication;

import org.jivesoftware.smack.Connection;
import org.jivesoftware.smack.XMPPConnection;
import org.jivesoftware.smack.XMPPException;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class XmppService extends Service{



    public void xmppService() throws XMPPException {

        Connection conn1 = new XMPPConnection("jabber.org");
        conn1.connect();
    }


    @Override
    public void onCreate(){
        //TODO:actions to perform when service is created
        try {
            xmppService();
        } catch (XMPPException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    @Override
    public IBinder onBind(Intent intent) {
        // TODO Replace with service binding
        return null;
    }
}

它卡住了我的应用程序并导致我和错误:没有 dns 解析器处于 Activity 状态。网络上没有关于它的任何内容。

我真的希望得到一些帮助或线索。

也试过这样:

private final static String server_host = "jabber.org";
私有(private)最终静态 int SERVER_PORT = 5222;

public void xmppService() 抛出 XMPPException {
ConnectionConfiguration config = new ConnectionConfiguration( server_host, SERVER_PORT);
XMPPConnection m_connection = new XMPPConnection(config);
        try {
             SASLAuthentication.supportSASLMechanism("PLAIN");
             config.setSASLAuthenticationEnabled(true);
             m_connection.connect();
            Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual);
        } catch (XMPPException e) {
            e.printStackTrace();
        }

}

@更新:

使用 smack 库而不是 asmack 给我带来了同样的问题。
我没有收到错误日志,但是在断开调试器连接后我得到:

最佳答案

我建议使用 Smack 而不是 aSmack。 Asmack 是 Smack 的修补和增强版本,而 aSmack 已经死了。在 Smack 代码重构完成,添加了一些新方法并重构了 DNS 类。

看到这个 Smack

更新
看到你的错误日志后,似乎是主 UI 线程 上的 网络调用的问题

如何解决 NetworkOnMainThread 异常?
使用 AsyncTask 使您的网络调用在不同的线程(在后台)而不是在应用程序的主线程上。

将您的代码移至 AsynTask:-

private class ConnectToXmpp extends AsyncTask<Void, Void, Void> {

    @Override
    protected Void doInBackground(Void... params) {
          ConnectionConfiguration config = new ConnectionConfiguration( server_host, SERVER_PORT);
          XMPPConnection m_connection = new XMPPConnection(config);
    try {
         SASLAuthentication.supportSASLMechanism("PLAIN");
         config.setSASLAuthenticationEnabled(true);
         m_connection.connect();
        Roster.setDefaultSubscriptionMode(Roster.SubscriptionMode.manual);
    } catch (XMPPException e) {
        e.printStackTrace();
    }

        return null;
    }

    @Override
    protected void onPostExecute(Void result) {

    }

}

现在你可以执行你的 AsyncTask:-
new ConnectToXmpp().execute();

有了这个,您的网络调用将在不同线程的后台进行。

看到这个 AsyncTask

关于android - 尝试在 Android 上使用 aSmack 连接到 XMPP 服务器让我 "no dns resolver active",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16962999/

10-10 02:25