2017-10-11 118 views
1

這是我在android上的第一個應用程序,我試圖編寫一個TCP客戶端。發送TCP數據包時程序崩潰

到目前爲止,我有一個Python的TCP服務器,我用python的TCP客戶端測試它,它工作正常。

我從here獲取了TCP客戶端示例。

當我啓動應用程序時,我可以在wireshark上看到握手,以便建立連接。

現在,問題是發送消息。當我把函數調用

if (mTcpClient != null) 
{ 
    mTcpClient.sendMessage("testing"); 
} 

在主要活動:

public void ChangeButtonState(View view) 
{ 
    boolean state = ((ToggleButton) view).isChecked(); 
    if (state) 
    { 

     if (mTcpClient != null) { 
      mTcpClient.sendMessage("testing"); 
     } 


     textView.setText("button is on. sent Tcp message. "); 
     textView.setVisibility(View.VISIBLE); 
    } else { 
     textView.setText("button is off"); 
    } 
} 

代碼崩潰在TcpClient的類行mBufferOut.println(message);

但是,如果我在TcpClient類中的行mBufferOut = new PrintWriter(socket.getOutputStream());之後立即調用該函數,則客戶端將傳輸該消息,服務器接收該消息並將其發送回客戶端。

所以我的問題是爲什麼代碼崩潰? mTcpClient成員不爲空。

+0

您是從主線程運行此代碼?請分享堆棧跟蹤 –

回答

0

您應該在後臺線程中發送網絡請求。使用AsyncTaskThread

new Thread(new Runnable(){ 
    public void run(){ 
     mTcpClient.sendMessage("test"); 
    } 
}).start(); 
+0

謝謝!解決了這個問題。爲什麼它應該在線程上呢? – user1673206

+0

很高興我能幫到你。如果您在前臺線程中發送網絡請求,應用程序將凍結,直到請求完成。所以android SDK已經迫使開發人員在後臺線程中執行網絡調用。 –