2012-11-09 19 views
-2

我是Android和Java編程的新手,我卡住了。Android套接字 - 我的代碼在工作2.3.6,但在4.x中沒有

我能夠創建一個TCP/IP通信客戶端(LAN),它在基於Windows的Web服務器上發送文本消息。我的三星Galaxy S Advance手機目前運行在2.3.6上,代碼運行良好。然而,在運行Android 4.0和Android 4.1的其他兩個設備上嘗試apk文件時,應用程序正在運行,但沒有消息到達PC上(測試在同一網絡上執行)。

我用發送報文的功能如下:

public void sednit(String IP,String MSG) { 
try { 
     // Socket s = new Socket ("192.168.128.102",39999); 
     Socket s = new Socket (ipaddress,39999); 
     //outgoing stream redirect to socket 
     OutputStream out = s.getOutputStream(); 
     PrintWriter output = new PrintWriter (out); 
     output.println(MSG); 
     output.flush(); 
     BufferedReader input = new BufferedReader (new InputStreamReader(s.getInputStream))); 
     //read line(s) 
     String st = input.readLine(); 
     //Close connection 
     s.close(); 
     } catch (Exception e) { 
     // Toast.makeText(getApplicationContext(), e.toString(),Toast.LENGTH_LONG).show(); 
      Toast.makeText(getApplicationContext(), "Unable to communicate with player", Toast.LENGTH_LONG).show(); 
     } 

我到底做錯了什麼?

是否有任何限制適用於Android 4或更新版本,或者我弄亂了我的清單文件?

謝謝。

+0

使用AsyncTask執行網絡調用 –

+0

您可能會遇到NetworkOnUIThread異常。檢查你的logcat的細節。解決方案 - 在單獨的線程上移動網絡操作 – mihail

回答

0

正如Tomislav所說在評論中使用Asynctask來進行網絡通信。
catch (Exception e) {是一個非常糟糕的想法..趕上你指望的例外,以便其他人可能被拋出,你可以看到他們。我們不知道什麼是你的程序出了什麼問題,當你這樣做時...

所以請或者做e.printStackTrace();或者移除try/catch,這樣我們就可以獲得你的logcat並幫助你。

1

您很可能會遇到NetworkOnMainThread例外。自Android Honeycomb以來,您需要在不同的線程中執行網絡操作以提高UI響應能力。最簡單的方法是使用AsyncTask來管理您的網絡操作(如果它很短),或者在需要維護連接時擴展java.io.Thread

+0

這不是'自薑餅',而是自Honeycomb以來。這就是爲什麼它在2.3.6下工作。然而,無論API級別如何,要麼是不可能的,要麼就是在主線程上做一個壞主意,而AysncTask是解決問題的好方法。 – NickT

+0

哎呀,對不起。你說得對,薑餅是實施之前的最後一個,而不是之後的第一個。我會編輯我的答案。 – Techwolf

相關問題