使用Android模拟器通过IP和端口访问networking设备

为什么我的Android的Java应用程序不连接到服务器?

我在android模拟器运行应用程序,并在我的电脑端口9999和主机127.0.0.1服务器,但只是不连接,我认为这种方法是不好的android应用程序。

更新:我使用API​​ 8 … Android 2.2!

这是工作好! 谢谢大家 ;)

这是我的源代码:

import android.app.Activity; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; //Java imports //import android.util.Log; import java.io.*; import java.net.*; import java.util.*; import java.util.logging.Level; import java.util.logging.Logger; public class MainActivity extends Activity{ //Variaveis Interface private Button ligar; private Button enviar; private EditText text1; private TextView text2; //Variaveis static Socket cSocket; static PrintWriter out; static BufferedReader in; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.main); //Declaração butões ligar = (Button) findViewById(R.id.ligar); enviar = (Button) findViewById(R.id.enviar); text1 = (EditText) findViewById(R.id.text1); text2 = (TextView) findViewById(R.id.text2); //Interacao ligar.setOnClickListener(new OnClickListener(){ public void onClick(View arg0){ connect(); } }); enviar.setOnClickListener(new OnClickListener(){ public void onClick(View arg0){ out.println("Hello"); text2.setText(""); } }); } //Outras Funcoes public void connect(){ //Funcao ligar cSocket = null; out = null; in = null; try{ cSocket = new Socket("10.0.2.2",4444); out = new PrintWriter(cSocket.getOutputStream(), true); in = new BufferedReader(new InputStreamReader(cSocket.getInputStream())); text2.setText("Estas conectado com sucesso."); } catch (IOException ex) { //Logger.getLogger(client.class.getName()).log(Level.SEVERE, null, ex); text2.setText("Erro! Na conexão"); } } // } 

Solutions Collecting From Web of "使用Android模拟器通过IP和端口访问networking设备"

看到这里 :

主机可以使用仿真器的IP地址10.0.2.2

**编辑,回答你的评论:*

为了完整性和更好地理解我的答案,请阅读Android模拟器文档 。

这些是从仿真器到达的IP地址 :

  • 10.0.2.1 ,路由器/网关地址。
  • 10.0.2.2主机回送接口的特殊别名(即开发计算机上的127.0.0.1)
  • 10.0.2.3 ,第一个DNS服务器
  • 10.0.2.4 / 10.0.2.5 / 10.0.2.6 ,可选的第二,第三和第四个DNS服务器(如果有的话)
  • 10.0.2.15仿真设备自己的networking/以太网接口
  • 127.0.0.1仿真设备自己的回送接口

那就是说,我们有:

  • 常见的错误1:从模拟器访问127.0.0.1试图到达你的主机。 正如我所说的,使用10.0.2.2
  • 常见错误2:尝试访问HostComputerIP:appServicePort上的仿真器服务HostComputerIP:appServicePort 。 由于您的主机本身(Windows,Linux,OS等)没有在该端口上运行服务,它将不起作用。 您需要将仿真器控制台上的端口redirect到仿真的Android实例本身的端口(请参阅下面的2)。

常见的networking需求:

1-模拟器应用程序作为客户端,本地计算机作为服务器

由于模拟器是NAT'd,我相信你可以直接连接到本地networking上的任何一台电脑。 我的意思是,由于虚拟路由器可以访问这两个networking,所以它应该能够处理即将离任的(即模拟器 – >真正的LAN)连接。

例如:在我的networking(192.168.0.x)上,我可以仿真器连接到我的真实路由器( 192.168.0.254 ),只需将仿真器Web浏览器指向http://192.168.0.254:port 。 我使用不同的服务(向番茄!),我可以在每个port上访问所有的服务。 没有必要像预期的那样处理端口转发。

通过你的代码的外观,我相信你需要:

 // I assume 192.168.0.114 is your server, which is // located on your local network, running a server application // on port 9999. cSocket = new Socket("192.168.0.114",9999); 

2-本地计算机作为客户端,模拟器应用程序作为服务器

现在这是一个不同的故事。 您需要在虚拟路由器上设置端口redirect 。 最简单的方法是:

从您的主机 (您的计算机,Linux上的控制台或Windows上的命令提示符)Telnet到“pipe理”系统(这不是模拟器):

 telnet localhost 5554 

之后,使用:

 adb forward tcp:localPort tcp:emulatorPort 

之后,您将能够在emulatorPort上获得服务,并且可以通过访问hostComputerIP:localPort从本地networking中的计算机连接到该hostComputerIP:localPort

这是人们(包括我)在模拟器中使用的方式,例如SSHDroid。

还要别的吗?

127.0.0.1进入本地主机。 虽然这是你的电脑自己的电脑,这是从手机的电话。 您需要提供实际的IP地址。 另外,如果您还没有设置,请确保您请求Internet权限。 请参阅有关权限的文档以及其他SOpost 。

更新:要回答您的评论,正如David从模拟器中指出的那样,您可以使用10.0.2.2访问您的主机。