Troubleshooting: Asmack stream error (host-unknown)
Solving the 'host-unknown' error when using asmack in Android development.
Problem
When trying to write an Android demo with asmack, an error named 'host-unknown' appears. Here is the error seen in 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)
Below is the code used:
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();
}
Solution
The 'host-unknown' error may be caused by an incomplete initialization of the connection
. After checking if connection == null
, make sure to initialize it properly with connection = new XMPPConnection(config);
.
Additionally, the issue may stem from not specifying the service name in the constructor of ConnectionConfiguration
. The service name should match the XMPP domain. For instance, if the user's email is user@something.com
, the service name should be "something.com"
.
You can determine the correct service name by logging the service name after connection.connect()
succeeds:
Log.e("Service Name", xmpp.getServiceName());
Then, use the service name in the constructor:
ConnectionConfiguration config = new ConnectionConfiguration(host, port, "something.com");
connection = new XMPPConnection(config);
Conclusion
This approach should address the 'host-unknown' error. For further reference, see the original discussion on Stack Overflow.