2012-03-16 99 views
1

我嘗試用asmack寫一個android演示。有一個名爲「host-unknown」的錯誤。我該如何解決這個問題?asmack流錯誤(主機 - 未知)

這是我看到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(); 
} 

EDIT2

的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> 
+0

你能告訴我們轉移的XML,如果有的話? – 2012-03-16 09:10:04

+1

我的意思是在請求中傳輸的smack xml。不是android xml佈局。 – 2012-03-16 09:48:26

+0

他是要求連接涉及的XMPP節 – Flow 2012-03-16 11:23:27

回答

4
  1. 首先,我不認爲你的代碼可以運行,因爲你檢查連接後== NULL,你不這樣做初始化連接,只需使用: connection = new XMPPConnection(config);
  2. 我遇到了未知主機的情況,問題在於我們沒有在ConnectionConfiguration的構造函數中指定服務名稱(您將它指定爲空字符串)。通常,如果用戶的電子郵件格式爲:[email protected],則服務名稱將爲「something.com」。無論如何,通過使用xmpp.getServiceName(),您可以在連接到服務器之後獲得確切的服務名稱(在connection.connect()成功之後)(您可以登錄以查看結果,例如:Log.e(「Service名稱「,xmpp.getServiceName()),然後查看Logcat並將服務名稱複製到構造函數中)。
  3. 享受。 :)