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

Java Android网络应用程序连接到Amazon EC2,java,android,sockets,amazon-ec2,serversocket,Java,Android,Sockets,Amazon Ec2,Serversocket,在这种发展中我是个新手。简而言之,我正在开发一款android应用程序,它可以向云发送一个字符串(我在亚马逊上有一个虚拟服务器),一切都很好,将字符串从我的手机发送到服务器,我打印我发送的字符串,它就行了!。但是当从服务器返回到我的android应用程序时(我在android手机上运行它),我什么都没有得到(响应应该是一个字符串+另一个串接),就是这样,很简单,对吗?但不幸的是,我无法收回。我测试了服务器端,它工作正常(AmazonEC2)。我不确定我是否能做到我正在做的事情,即: 通过使用套接

在这种发展中我是个新手。简而言之,我正在开发一款android应用程序,它可以向云发送一个字符串(我在亚马逊上有一个虚拟服务器),一切都很好,将字符串从我的手机发送到服务器,我打印我发送的字符串,它就行了!。但是当从服务器返回到我的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[] { "????" });

    }
 }`
`import android.os.Bundle;
导入android.app.Activity;
导入android.widget.TextView;
导入java.io.DataInputStream;
导入java.io.DataOutputStream;
导入java.net。*;
导入android.os.AsyncTask;
导入android.view.view;
公共类ReadWebpageAsyncTask扩展活动{
私有文本视图文本视图;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
textView=(textView)findViewById(R.id.TextView01);
}
私有类下载WebPagetTask扩展异步任务{
@凌驾
受保护的字符串doInBackground(字符串…URL)
{
字符串响应=”;
//传输
尝试
{
套接字=新套接字(“MyAmazonServerIp”,5678);
DataOutputStream salida=新的DataOutputStream(socket.getOutputStream());
salida.writeUTF(“Llego Perfectament”);
socket.close();
salida.close();
}
捕获(例外e)
{
e、 printStackTrace();
}
//终点
//接待
布尔值ak=true;
尝试
{
ServerSocket ServerSock=新的ServerSocket(7896);
while(ak)
{
Socket cl=ServerSock.accept();
InetAddress ipC=cl.getInetAddress();
DataInputStream en=新的DataInputStream(cl.getInputStream());
响应=en.readUTF();
//response=response.toString();
ak=假;
}  
}
捕获(异常扩展)
{
exp.printStackTrace();
}
//招待会结束
返回响应;
}//后台结束
@凌驾
受保护的void onPostExecute(字符串结果)
{
setText(结果);
}
}
公共作废阅读网页(查看){
DownloadWebPagetTask=新建DownloadWebPagetTask();
task.execute(新字符串[]{“?”});
}
}`
我真的很感激任何帮助,因为我已经在这方面工作了几天,我还没有能够解决它。
谢谢,

您这样做的方式无法通过3G甚至WiFi连接工作。它无法在3G上工作,因为您的亚马逊服务器看到的地址是您手机提供商网络上的代理/防火墙地址。没有任何外部应用程序可以直接打开手机的插孔。相反,您需要通过手机为发送初始信息而创建的同一个插座将响应发送回

通过WiFi,它将无法工作,因为您的WiFi防火墙可能正在进行NAT转换

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


因此,基本上,只需打开原始套接字并在该套接字上侦听响应,然后在云服务器上通过接收请求的同一套接字将响应发送回来。

非常感谢Kaediil,我非常感谢您的帮助。很抱歉,我当时在外地工作,但我会重新开始工作。再次感谢您的光临,祝您万事如意!。。阿尔贝托,凯迪尔,谢谢,我现在可以用了。。。它从我的手机向远程pc发送字符串,同时手机也从远程pc接收字符串。现在我正在尝试实现文件传输(首先,从手机到远程pc-远程pc有一个服务器应用程序,可以对文本文件进行排序-并将其发送回手机)。现在,远程pc正在成功接收文件并对其进行排序。但是当我把文件传输回手机时,手机上出现了一个异常。我在同一个插座上做这个。以下是部分手机应用程序代码: