2014-03-02 122 views
1

我正在嘗試使用java應用程序(服務器「PC」)連接android應用程序(客戶端),這裏是我的客戶端代碼。Android Socket編程

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    btn = (Button) findViewById(R.id.button1); 
    txt = (EditText) findViewById(R.id.editText1); 

    btn.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      new CallServer().execute(); 
     } 
    }); 
} 

public class CallServer extends AsyncTask<String, Integer, String> { 

    @Override 
    protected String doInBackground(String... arg0) { 
     String modifiedSentence = "hello"; 
     Socket clientSocket; 
     try { 
      clientSocket = new Socket("192.168.1.100", 8081); 


      DataOutputStream outToServer = new DataOutputStream(
        clientSocket.getOutputStream()); 
      BufferedReader inFromServer = new BufferedReader(
        new InputStreamReader(clientSocket.getInputStream())); 

      outToServer.writeBytes("hello world"); 

      modifiedSentence = 
      (inFromServer.readLine()); 

      clientSocket.close(); 

     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return modifiedSentence; 
    } 

    protected void onPostExecute(String result) { 
     txt.setText(result); 
    } 
} 

的Android許可

<uses-sdk 
    android:minSdkVersion="8" 
    android:targetSdkVersion="17" /> 
<uses-permission android:name="android.permission.INTERNET"/> 

我不能用這個代碼中找到的問題,因爲它不會給任何類型的交戰或錯誤我的服務器端代碼工作完美,因爲我已經與其他Java測試它應用程序(客戶端)。沒有任何類型的端口問題,因爲我通過在不同的機器上保留客戶端和服務器端代碼來測試它,並且它工作正常。

+0

您不能從後臺線程更改文本。該部分需要在onPostExecute中。 – kichik

回答

1

的問題是我的服務器端代碼。我沒有關閉BufferedReader,所以現在它工作正常。

1

很明顯它不是一個路由器,防火牆,你是一樣的網下相關的問題,所以只有幾種可能性:

  • 沒有什麼對服務器端的是IP偵聽該端口
  • 服務器端有一個阻止連接嘗試的本地防火牆
  • 您沒有使用WIFI,因此您不在同一個網絡中。

你應該確保你可以打開該服務的某種方式,這將有助於你調試的罪魁禍首。如果你已經這樣做了,我建議使用一些調試工具來跟蹤TCP數據包(我不知道你在目標機器上使用什麼樣的操作系統;如果是某種Linux發行版,tcpdump可能會有所幫助)。

+0

我正在使用Wifi和服務器正在監聽,因爲我在PC上創建了其他客戶端應用程序,並且我還阻止了防火牆。 我也嘗試調試一切順利,但在達到'modifiedSentence = inFromServer.readLine();'這一步之後沒有調用斷點。我正在使用Windows 7 –

1

您無法從doInBackground修改UI元素,例如txt,因爲它是不同的線程。

製作doInBackground回報您的套接字數據和設置您的txtonPostExecute

+0

我已經嘗試了onPostExecute,但它不起作用。 –

0

使用的invoke(新methodinvoker(代表{})),如C#