2011-01-20 57 views
0

我似乎得到一個簡單的TCP連接之間的Java服務器應用程序和Android(我已經嘗試了模擬器和Android Dev Phone 2)。我在模擬器上得到這個錯誤「應用程序數據接收(進程com.mdog.datareceive)意外停止,請重試。」Android的TCP - 程序崩潰

原諒我,但我對android很新。所以我不知道如何調試它......但我沒有嘗試任何太複雜的東西。最終,我想嘗試「消耗」我在應用程序中收到的字節。並在後臺運行TCP ......但現在只需讓手機和計算機進行通信就會很好。

如果你能幫助我,那會很棒。

代號爲Android的一面:

public class Receive extends Activity { 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     TextView tv = new TextView(this); 

     Socket connectionSocket = null; 
     byte[] inputHolderByteArray = new byte[5*1024]; 

     /* Connect to Server */ 
     try { 
      connectionSocket = new Socket("192.168.0.104", 11313); 
     } catch (UnknownHostException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     /* Send an s to server to start transmission */ 
     try { 
      PrintWriter out = new PrintWriter(connectionSocket.getOutputStream(), true); 
      out.print('s'); 
      out.flush(); 
     } catch (IOException e1) { 
      e1.printStackTrace(); 
     } 

     /* read server transmission */ 
     try { 
      connectionSocket.getInputStream().read(inputHolderByteArray); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     tv.setText("done"); 
     setContentView(tv); 

    } 

} 
+1

你要實際的異常的堆棧跟蹤,你可以從logcat中得到它,無論是在Eclipse中使用DDMS角度來看,或者從命令行使用adb logcat。 – superfell 2011-01-20 04:49:53

+0

是的,我們需要stacktrace&Mike我建議你使用'Log.e'而不是'e.printstackTrace()'來記錄錯誤。 – 100rabh 2011-01-20 05:37:21

回答

0

雖然superfell是正確的,完整的堆棧跟蹤將有助於診斷此,根據您的代碼/一個可能的問題是,你打破了每條語句把它分開嘗試/ catch塊。這可能不是你的核心問題(我猜你有一個網絡問題),但這是導致系統崩潰的原因。

通常在Java中,相互依賴的可引發異常的語句放在同一個try/catch語句中。最可能發生的情況是代碼在您嘗試定義新套接字的位置輸入您的第一個try catch塊。這會拋出一個像'UnknownHostException'的異常。 connectionSocket保持爲空,但代碼進入UnknownHostException的catch。您打印堆棧跟蹤,但該程序不會退出。您的代碼繼續到您要撥打的以下try/catch塊

PrintWriter out = new PrintWriter(connectionSocket.getOutputStream(), true); 

這會導致NullPointerException。這是一個RuntimeException,它沒有被檢查,並且因爲它沒有被選中,所以你不必在catch語句中捕獲它。現在這個異常會導致您的虛擬機崩潰並導致您報告的錯誤屏幕。

因此,儘管獲取logcat stacktrace會告訴我們更多關於您的問題的信息,但您構建的代碼應該被壓縮爲單個try/catch語句,因爲所有代碼都依賴於第一次try/catch完成而沒有錯誤。

編輯:

嘗試構建您的應用程序是這樣

public class Receive extends Activity { 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    TextView tv = new TextView(this); 

    Socket connectionSocket = null; 
    byte[] inputHolderByteArray = new byte[5*1024]; 

    /* Connect to Server */ 
    try { 
     connectionSocket = new Socket("192.168.0.104", 11313); 
     PrintWriter out = new PrintWriter(connectionSocket.getOutputStream(), true); 
     out.print('s'); 
     out.flush(); 
     connectionSocket.getInputStream().read(inputHolderByteArray); 
    } catch (UnknownHostException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

    tv.setText("done"); 
    setContentView(tv); 

} 

} 

當我們說「得到堆棧跟蹤」,這意味着你需要使用的Android調試橋連接到模擬器或設備(ADB )和一個名爲logcat的程序。如果您只有模擬器並且沒有電話連接到您的電腦,請嘗試運行以下命令: adb logcat *:D 這會將日誌信息輸出到終端。保持此窗口打開並運行您的應用程序。您應該看到打印的堆棧跟蹤。 Please take the time to get to know logcat and adb.

1

模擬器的每個實例中運行的背後,從您的開發機器的網絡接口和設置,並從互聯網隔離開一個虛擬的路由器/防火牆服務。

每個實例的虛擬路由器管理10.0.2/24網絡地址空間 - 由路由器管理的所有地址在10.0.2形式,其中是一個數字。該空間內的地址由仿真器/路由器預先分配。

你必須引用開發機器的地址爲:10.0.2.2而不是192.168.0.104你的情況。如果要引用到另一臺機器在你的局域網,那麼你可以Use Network Redirections

http://developer.android.com/guide/developing/tools/emulator.html#emulatornetworking