我是这种发展的新手。简而言之,我正在开发一个向云端发送字符串的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[] { "????" });
}
}`
我会非常感谢任何帮助,因为我已经为此工作了好几天而且我无法解决它。 谢谢,
答案 0 :(得分:3)
你这样做的方式不能通过3G或甚至WiFi连接工作。它不能通过3G工作,因为您的Amazon服务器看到的地址是您的单元提供商网络上的代理/防火墙的地址。没有外部应用程序可以直接打开手机套接字。相反,您需要通过手机创建的同一套接字发回响应,以发送初始消息。
通过WiFi,由于您的WiFi防火墙可能会进行NAT转换,因此无法正常工作。
这样做有很多原因,其中最重要的是数据使用和安全性。具体来说,请考虑一下您的手机是否可以在整个互联网上公开寻址?它会不断受到攻击的打击。
所以基本上,只需保持原始套接字打开并在该套接字上侦听响应,然后在您收到请求的同一套接字上发回响应。