【问题标题】:Android Network Application connected to Amazon EC2连接到 Amazon EC2 的 Android 网络应用程序
【发布时间】:2012-07-30 16:58:29
【问题描述】:

我是这种发展的新手。简而言之,我正在开发一个将字符串发送到云的 android 应用程序(我在亚马逊上有一台虚拟服务器机器),一切正常,将字符串从我的手机发送到服务器机器,我打印字符串我发送,它的工作原理!但是,当从服务器将响应返回到我的 android 应用程序(我在我的 android 手机上运行它)时,我什么也没有得到(响应应该是一个字符串 + 另一个串联的字符串),就是这样,简单吧?但不幸的是,我无法收到它。我测试了服务器端,它工作正常(亚马逊 EC2)。我不确定我是否可以做我正在做的事情:

在 AsyncTask 类的 doInBackground() 方法上使用 SOCKET 向云发送数据,创建传输代码以发送字符串。 在相同的方法 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[] { "????" });

    }
 }`

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

【问题讨论】:

    标签: java android sockets amazon-ec2 serversocket


    【解决方案1】:

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

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

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

    所以基本上,只需保持原始套接字打开并在该套接字上侦听响应,在您的云服务器上只需通过您收到请求的同一套接字将响应发送回。

    【讨论】:

    • 非常感谢 Kaediil,非常感谢您的帮助。对不起,我不在城里工作,但我要重新开始工作。再次感谢您的光临,祝您好运!... Alberto。
    • Kaediil,谢谢我现在可以正常工作了...它将字符串从我的手机发送到远程 pc 以及手机从远程 pc 接收字符串。现在我正在尝试实现文件传输(首先,从手机到远程 PC - 远程 PC 有一个对文本文件进行排序的服务器应用程序 - 并将其发送回手机)。现在,远程电脑正在成功接收文件并对其进行排序。但是当将文件传输回手机时,我在手机上遇到异常。我正在通过同一个套接字执行此操作。以下是手机应用代码的一部分:
    猜你喜欢
    • 2018-05-22
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多