我尝试用asmack编写一个Android演示。没有一个名为“host-unknown”的错误。我该如何解决?

这是我在LogCat中看到的内容:


03-16 08:31:10.671: I/getConnection(795): connect success
03-16 08:31:10.905: W/System.err(795): stream:error (host-unknown)
03-16 08:31:10.905: W/System.err(795):    at org.jivesoftware.smack.PacketReader.parsePackets(PacketReader.java:261)
03-16 08:31:10.912: W/System.err(795):    at org.jivesoftware.smack.PacketReader.access$000(PacketReader.java:44)
03-16 08:31:10.912: W/System.err(795):    at org.jivesoftware.smack.PacketReader$1.run(PacketReader.java:71)



我的代码:

private static String host = "172.16.131.99";
private static int port = 5222;

private Button btnLogin;

private static XMPPConnection connection = null;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    btnLogin = (Button) findViewById(R.id.btnLogin);
    btnLogin.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            if (login()) {
                showMessage("Login success");
            } else {
                showMessage("Login failure");
            }
        }

    });
}

private XMPPConnection getConnection() {
    if (connection == null) {
        ConnectionConfiguration config = new ConnectionConfiguration(host, port, "");
        // use TLS
        config.setSecurityMode(SecurityMode.required);
        try {
            connection.connect();
            Log.i("getConnection", "connect success");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    return connection;
}

private boolean login() {
    try {
        // login
        getConnection().login("admin", "123456");
        Log.i("Login", "login success");

        // set status
        Presence presence = new Presence(Presence.Type.available);
        getConnection().sendPacket(presence);
        Log.i("Login", "set status success");

        return true;
    } catch (Exception e) {
        e.printStackTrace();
    }

    return false;
}

private void showMessage(String message) {
    Toast.makeText(this, message, 1000).show();
}


编辑2

XML文件代码非常简单,仅包含一个按钮。

我的xml文件代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button android:id="@+id/btnLogin"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/login" />
</LinearLayout>

最佳答案

首先,我认为您的代码无法运行,因为在您检查connection == null之后,您无需初始化连接,只需使用:
连接=新的XMPPConnection(config);
我遇到了未知主机的情况,问题是我们没有在ConnectionConfiguration的构造函数中指定服务名称(您将其指定为空字符串)。通常,如果用户的电子邮件采用以下格式:[email protected],则服务名称将为“ something.com”。无论如何,使用xmpp.getServiceName()连接到服务器后(在connection.connect()成功之后),您可以获得确切的服务名称(您可以登录以查看结果,例如:Log.e(“ Service名称”,xmpp.getServiceName()),然后查看Logcat并将服务名称复制到构造函数中。
很喜欢:)

关于android - asmack流错误(主机未知),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9734316/

10-13 22:56