2012-08-01 122 views
2

我是這種發展中的新人。簡而言之,我正在開發一個向雲發送字符串的Android應用程序(我在亞馬遜上有一臺虛擬服務器機器),一切正常,從我的手機發送字符串到服務器機器,我打印字符串我發送和它的作品!但是,當從服務器迴應我的Android應用程序(我在我的android手機上運行它)的響應時,我什麼都沒有收到(響應應該是一個字符串+另一個字符串連接),就是這樣,容易嗎?但不幸的是我無法收回它。我測試了服務器端,它工作正常(亞馬遜EC2)。我不太確定我是否可以做我正在做的事情:連接到亞馬遜EC2的Android網絡應用程序

創建傳輸代碼以通過使用套接字發送字符串將數據發送到AsyncTask類的doInBackground()方法上的CLOUD。 在同樣的方法doInBackground我做的代碼來接收回應,通過使用ServerSocket接收來自雲端的迴應。是否有可能或者我需要另一個線程或類似的東西?

這裏是我的代碼:

`import android.os.Bundle; 
import android.app.Activity; 
import android.widget.TextView; 

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.net.*; 
import android.os.AsyncTask; 
import android.view.View; 


public class ReadWebpageAsyncTask extends Activity { 
private TextView textView; 


/** Called when the activity is first created. */ 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     textView = (TextView) findViewById(R.id.TextView01); 
    } 

    private class DownloadWebPageTask extends AsyncTask<String, Void, String> { 
     @Override 
     protected String doInBackground(String... urls) 
     { 
      String response = "";    

      //Transmission 
      try 
       { 
        Socket socket = new Socket("MyAmazonServerIp", 5678); 
        DataOutputStream salida = new DataOutputStream (socket.getOutputStream()); 
        salida.writeUTF("Llego Perfectamente"); 
        socket.close(); 
        salida.close(); 
       } 
        catch (Exception e) 
         { 
          e.printStackTrace(); 
         } 

      //Final ends 


      // Reception 
      boolean ak=true; 
      try 
      { 
       ServerSocket ServerSock = new ServerSocket(7896); 
       while(ak) 
        { 
        Socket cl=ServerSock.accept(); 
        InetAddress ipC = cl.getInetAddress(); 

        DataInputStream en= new DataInputStream(cl.getInputStream()); 
        response= en.readUTF(); 
        //response= response.toString(); 
        ak=false; 
       } 
      } 
      catch(Exception exp) 
      { 
       exp.printStackTrace(); 
      } 
      // Reception ends 

      return response; 

     } //doInBackground ends 

     @Override 
     protected void onPostExecute(String result) 
      { 
      textView.setText(result); 
      } 
    } 

    public void readWebpage(View view) { 
     DownloadWebPageTask task = new DownloadWebPageTask(); 
     task.execute(new String[] { "????" }); 

    } 
}` 

我真的感謝所有幫助,因爲我一直在這幾天,我一直沒能解決這個問題。 謝謝,

回答

3

你這樣做的方式無法通過3G甚至可能連接WiFi連接。它無法通過3G工作,因爲您的Amazon服務器所看到的地址是您的手機提供商網絡上代理/防火牆的地址。沒有外部應用程序可以直接打開套接字到您的手機。相反,您需要通過手機創建的相同套接字將響應發回以發送初始消息。

通過WiFi,它將無法工作,因爲您的WiFi防火牆可能會進行NAT轉換。

這樣做有很多原因,其中最重要的是數據使用和安全性。具體來說,請考慮一下您的手機是否可公開訪問整個互聯網?它會不斷受到試圖破解它的打擊。

所以基本上,只要保持原來的套接字打開,並偵聽該套接字和雲服務器上的響應,只需通過您收到請求的相同套接字發回響應即可。

+0

非常感謝你Kaediil, 我真的很感謝你的幫助。抱歉,我已經離開這個城市工作了很晚,但我會再次開始工作。再次感謝您的光臨,祝您有個美好的明天! Alberto。 – KinGPinG 2012-08-20 15:44:11

+0

Kaediil,謝謝我現在正在工作......它從我的手機發送字符串到遠程PC,以及手機從遠程PC接收字符串。現在我試圖實現文件傳輸(首先,從手機到遠程PC - 遠程PC有一個服務器應用程序,它將文本文件分類並將其發送回手機)。現在,遠程PC正在成功接收文件並對其進行分類。但是,將文件傳回電話時,手機上會出現異常情況。我正在通過同一個套接字來做這件事。以下是手機應用程序代碼的一部分: – KinGPinG 2012-09-25 15:41:56