Android网络应用程序连接到Amazon EC2

时间:2012-08-01 18:27:54

标签: java android sockets amazon-ec2 serversocket

我是这种发展的新手。简而言之,我正在开发一个向云端发送字符串的Android应用程序(我在亚马逊上有一台虚拟服务器机器),一切正常,将我的手机中的字符串发送到服务器机器,我打印字符串I& #39; m发送,它的工作原理!但是当从服务器回到我的Android应用程序的响应时(我在我的Android手机上运行它)我什么都得不到(响应应该是一个字符串+另一个连接的字符串),&#39是的,这很容易吗?但不幸的是我无法收回。我测试了服务器端并且它正常工作(亚马逊EC2)。我不确定我是否可以做我正在做的事情:

创建传输代码,通过使用SOCKET将数据发送到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[] { "????" });

    }
 }`

我会非常感谢任何帮助,因为我已经为此工作了好几天而且我无法解决它。 谢谢,

1 个答案:

答案 0 :(得分:3)

你这样做的方式不能通过3G或甚至WiFi连接工作。它不能通过3G工作,因为您的Amazon服务器看到的地址是您的单元提供商网络上的代理/防火墙的地址。没有外部应用程序可以直接打开手机套接字。相反,您需要通过手机创建的同一套接字发回响应,以发送初始消息。

通过WiFi,由于您的WiFi防火墙可能会进行NAT转换,因此无法正常工作。

这样做有很多原因,其中最重要的是数据使用和安全性。具体来说,请考虑一下您的手机是否可以在整个互联网上公开寻址?它会不断受到攻击的打击。

所以基本上,只需保持原始套接字打开并在该套接字上侦听响应,然后在您收到请求的同一套接字上发回响应。