2

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

创建传输代码以使用 SOCKET 将数据发送到来自 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 连接工作。它不能通过 3G 工作,因为您的亚马逊服务器看到的地址是您的手机提供商网络上的代理/防火墙的地址。没有任何外部应用程序可以直接打开您手机的套接字。相反,您需要通过电话创建的用于发送初始消息的同一套接字将响应发送回。

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

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

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

于 2012-08-01T18:36:12.970 回答