2

私はこの種の開発に少し新しいです。簡単に言うと、私はクラウドに文字列を送信するandroidアプリに取り組んでいます(私はAmazonに仮想サーバーマシンを持っています)、すべてがうまく機能し、電話からサーバーマシンに文字列を送信します。送信して動作します!。しかし、サーバーからAndroidアプリに応答を返すとき(Android携帯で実行しています)、何も取得されません(応答は文字列+別の文字列を連結する必要があります)、それは簡単ですよね?しかし、残念ながら私はそれを受け取ることができません。サーバー側をテストしましたが、正常に動作しています(AmazonEC2)。私がしていることを私ができるかどうかは本当にわかりません。

AsyncTaskクラスからdoInBackground()メソッドのクラウドにデータを送信するソケットを使用して文字列を送信する送信コードを作成します。同じメソッド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[] { "????" });

    }
 }`

私はこれに何日も取り組んできましたが、それを解決することができなかったので、私は本当にどんな助けにも感謝します。ありがとう、

4

1 に答える 1

3

あなたがやっている方法は、3G またはおそらく WiFi 接続では機能しません。Amazon サーバーが認識するアドレスは、セルプロバイダーのネットワーク上のプロキシ/ファイアウォールのアドレスであるため、3G では機能しません。外部アプリケーションは、電話機に対して直接ソケットを開くことはできません。代わりに、電話が最初のメッセージを送信するために作成した同じソケットを介して応答を返す必要があります。

WiFi 経由では、WiFi ファイアウォールで NAT 変換が行われる可能性があるため、機能しません。

これは多くの理由で行われますが、データの使用とセキュリティが重要です。具体的には、あなたの電話がインターネット全体に対してパブリックにアドレス指定できるかどうかを考えてみてください。それは常にハッキングの試みに見舞われます。

したがって、基本的には、元のソケットを開いたままにして、そのソケットで応答をリッスンし、クラウドサーバーで、要求を受信したのと同じソケットを介して応答を返すだけです。

于 2012-08-01T18:36:12.970 に答える