参考文章:http://blog.csdn.net/highram/article/details/6577465
http://blog.163.com/fanning_7213/blog/static/2496505201137101721665/
第一位作者写的很好 现在复制如下
开发的过程中遇到一个问题:android的模拟器有个很诡异的特点,就是访问网络的时候只可以从模拟器主动往出去连。但是却无法主的从外面连接模拟器,这个特点和NAT几乎完全一样,具有单向连接的特性。实际开发中我们希望模拟器像一台独立的手机一样,能和处于同一局域网中的手机进行端对端的通信。这时就需要做端口重定向。
假定- A是PC机 - B是你的第一个模拟器- C是你的第二个模拟器。 在B和C,127.0.0.1指的是模拟系统自身的环回接口,但10.0.2.2是指A的环回接口(又名A:127.0.0.1,指向PC机)。 10.0.2.15指的是模拟系统自身的网络地址。
比方说,我们要运行在B服务器在端口5000监听 即 10.0.2.15:5000 -在B的控制台,设置一个tcp重定向 redir add tcp:5000:5000 - 使在C客户端连接到tcp:10.0.2.2:5000 -即可访问到B的5000端口。
因为“redir加上”这个工程创建从一个重定向:127.0.0.1:5000到B:10.0.2.15:5000
那么C连接到B:10.0.2.2:5000这已经重定向到:127.0.0.1:5000都到B:10.0.2.15:5000
1 首先实现的是android模拟器终端中重定向(是在cmd下面)
步骤 1.打开两个模拟终端 adb devices (5554 5556)然后telnet 上5554(5554作为服务器端,5556作为客户端),命令telnet localhost 5554 成功后会有个啥子哦Ok的提示,然后就是端口的重定向,命令 redir add tcp:8000:7000(这一步特别要注意8000对应着客户端的new Socket(“10.0.2.2”,8000),7000对于这服务器端的SERVERPORT,即ServerSocket serverSocket = new ServerSocket(SERVERPORT),这里千万不能搞反 ,我就是搞反了 话了我一上午调试时间 悲催啊);
步骤 2。 这里重定向就完成了,可用命令redir list 查询重定向的端口,用redir del tcp:8000 删除刚才重定向的端口,可以关掉这个窗口了 。ps: 前面定义的重定向如果没有删除的话 将会一直存在 redir list 可以查询
2 代码:(是在网上找的,自己修改了哈,没学过java的搞android 伤的起?)
服务器端:

1 package com.android.study;
2
3 import android.app.Activity;
4 import android.os.Bundle;
5 import java.net.ServerSocket;
6 import java.net.Socket;
7
8
9 public class MainActivity extends Activity {
10 /** Called when the activity is first created. */
11 public static final String SERVERIP = "10.0.2.15";//这个地址其实没有用到
12 public static final int SERVERPORT = 5000; //注意这里和上面重定向的配置是有关系的。
13 @Override
14 public void onCreate(Bundle savedInstanceState) {
15 super.onCreate(savedInstanceState);
16 setContentView(R.layout.main);
17
18 try {
19 ServerSocket serverSocket = new ServerSocket(SERVERPORT);
20 while (true) {
21 System.out.println("hell");
22 Socket client = serverSocket.accept();
23 System.out.println("hell2");
24 System.out.println("S: Receiving.../n"+client.getInetAddress());
25 client.getInetAddress();
26 }
27 }catch(Exception e) {
28 System.out.println("S: Error");
29 e.printStackTrace();
30 }
31 }
32 }
客户端:
1 package com.socket.client;
2
3
4 import java.io.*;
5 import java.net.Socket;
6 import java.net.UnknownHostException;
7
8 import android.app.Activity;
9 import android.os.Bundle;
10 import android.text.TextUtils;
11 import android.view.View;
12 import android.view.View.OnClickListener;
13 import android.widget.Button;
14 import android.widget.EditText;
15 import android.widget.Toast;
16
17 public class main extends Activity implements OnClickListener{
18 /** Called when the activity is first created. */
19 //定义声明需要用到的UI元素
20 private EditText edtmsgcontent;
21 private Button btnSend;
22 private String ip="10.0.2.2";
23 private int port=8000;
24 @Override
25 public void onCreate(Bundle savedInstanceState) {
26 super.onCreate(savedInstanceState);
27 //setContentView(R.layout.main);
28 InitView();
29 }
30 private void InitView()
31 {
32 //显示主界面
33 setContentView(R.layout.main);
34
35 //通过id获取ui元素对象
36 edtmsgcontent=(EditText)findViewById(R.id.msgcontent);
37 btnSend=(Button)findViewById(R.id.btnsend);
38
39 //为btnsend设置点击事件
40 btnSend.setOnClickListener(this);
41 }
42
43 public void onClick(View bt)
44 {
45 try
46 {
47 String msg=edtmsgcontent.getText().toString();
48 if(!TextUtils.isEmpty(msg))
49 SendMsg(ip,port,msg);
50 else
51 {
52 Toast.makeText(this,"请先输入要发送的内容", Toast.LENGTH_LONG);
53 edtmsgcontent.requestFocus();
54 }
55 }
56 catch (Exception e) {
57 // TODO Auto-generated catch block
58 e.printStackTrace();
59 }
60 }
61 public void SendMsg(String ip,int port,String msg)
62 throws UnknownHostException, IOException
63 {
64 try
65 {
66 Socket socket=null;
67 socket=new Socket(ip,port);
68 BufferedWriter writer=new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
69 writer.write(msg);
70 writer.flush();
71 writer.close();
72 socket.close();
73 }
74 catch(UnknownHostException e)
75 {
76 e.printStackTrace();
77 }
78 catch (IOException e)
79 {
80 e.printStackTrace();
81 }
82 }
83 }