我在代码中尽可能简单地做到了这一点。我在 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/