2012-07-22 47 views
0

我已經寫了一個服務器端客戶端模型的android程序。我的電腦充當服務器,AVD充當客戶端。我使用10.0.2.2作爲服務器地址來連接,但服務器端沒有收到任何信息。當客戶端是一個普通的Java程序時,我的服務器工作正常。當客戶端是Android模擬器時會發生問題。我一直在研究這個問題很長時間,但我仍然沒有解決方案。希望有人能幫助我,謝謝! 我的代碼: 服務器:Android模擬器和PC服務器套接字通信

import java.net.*; 
import java.io.*; 
public class Server { 

    public static void main(String[] args) throws IOException{ 

     ServerSocket server = new ServerSocket(6002); 
     while(true){ 
      Socket client = server.accept(); 
      BufferedReader in= new BufferedReader(new InputStreamReader(client.getInputStream())); 
      System.out.println(in.readLine()); 
     } 
    } 
} 

客戶端:

public class modules extends Activity { 
    private ListView myListView; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.modules); 
     myListView = (ListView)findViewById(R.id.listView1); 

     Intent intent = getIntent(); 
     Bundle b = intent.getExtras(); 
     String semester = b.getString("semester"); 
     String subject = b.getString("subject"); 

     try { 
      Socket socket = new Socket("10.0.2.2",6002); 
      PrintWriter out=new PrintWriter(socket.getOutputStream(),true); 
      String s1 = "SEME" + semester; 
      out.println(s1); 
      out.flush(); 
      String s2 = "SUBJ" + subject; 
      out.println(s2); 
      out.flush(); 
      socket.close(); 

     } catch(UnknowHostException e) { 
       e.printStackTrace(); 
     } catch(IOException e) { 
       e.printStackTrace(); 
     } 
    } 
} 

在logcat中有喜歡的錯誤:

android.os.NetworkOnMainThreadException; 

,也錯誤與嚴格模式:

07-22 14:24:24.892: E/AndroidRuntime(759): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099). 

我在清單xml文件中添加了用戶權限,因此問題必須是其他內容。

+0

logcat中是否有錯誤?權限可能? – charlypu 2012-07-22 13:51:59

+0

*有效的Java#65:不要忽略異常。*更少執行「一刀切」的異常* *完全忽略*。毫不奇怪,你有問題試圖找到原因... – davidcesarino 2012-07-22 14:05:52

+0

非常感謝你們!我在這裏是新的,你的好意真的讓我印象深刻! – starrapier 2012-07-22 14:13:06

回答

2

看看錯誤說的是什麼:NetworkOnMainThreadException。這意味着你不應該在Android的主線程上進行網絡操作,因爲如果你的請求恰好延遲了一段時間,設備的響應將被阻塞,直到請求完成。

爲了在android上使用Socket客戶端,你應該看看AsyncTask,線程或服務也許。我建議你使用AsyncTask,這非常簡單。你在你的onCreate有的代碼()方法應該放在一個擴展的AsyncTask這樣其他類:

public class YourAsyncTask extends AsyncTask<Void, Void, Void> 
{ 
    protected Void doInBackground(Void... params) 
    { 
     //your socket code here... 
    } 
} 

欲瞭解更多信息,請檢查文檔的AsyncTask或瀏覽網頁/計算器完整例子!

希望這有助於......再見。

+0

問題已解決。十分感謝!我希望我能成爲你的專家。還要感謝@charlypu的幫助! – starrapier 2012-07-23 06:10:24

+1

我不是專家,只是遭受了和你一樣的錯誤,並解決了它:)。祝你好運!您可以將其標記爲正確的答案,以便問題顯示爲已解決。問候。 – unbekant 2012-07-23 11:53:17

相關問題