android socket通讯,PC和模拟器,两个模拟器之间的通信

我已经试验成功:

 ps:模拟器做服务器,PC机做客户端。如果通过wifi连接的话直接访问IP就行,不用重定向。

      PC访问模拟器用localhost即127.0.0.1, 模拟器 访问 模拟器用10.0.2.2

      本人已成功运行,看你的RP了- -

server:

 

Java代码   收藏代码
  1. /** 
  2.  * Server.java 
  3.  * @author wuzq 
  4.  * @create 2012-2-21 
  5.  */  
  6. package com.warner.client;  
  7.   
  8. import java.io.BufferedReader;  
  9. import java.io.BufferedWriter;  
  10. import java.io.Console;  
  11. import java.io.IOException;  
  12. import java.io.InputStreamReader;  
  13. import java.io.OutputStreamWriter;  
  14. import java.io.PrintWriter;  
  15. import java.net.Socket;  
  16.   
  17. public class G3ExpPCclient {  
  18.     public static final String adb_path= "E:\\android-sdk-windows\\tools\\adb ";//adb所在路径  
  19.     private static final String HOST = "localhost";  
  20.     private static final int PORT = 8080;  
  21.     private Socket socket = null;  
  22.     private BufferedReader in = null;  
  23.     private PrintWriter out = null;  
  24.   
  25.     public G3ExpPCclient() {  
  26.         try {  
  27.             socket = new Socket(HOST, PORT);  
  28.             in = new BufferedReader(new InputStreamReader(socket.getInputStream()));  
  29.             out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);  
  30.         } catch (IOException ex) {  
  31.             ex.printStackTrace();  
  32.             System.out.println("login exception" + ex.getMessage());  
  33.         }  
  34.     }  
  35.   
  36.     public void openUrl(String msg) {  
  37.         if (socket.isConnected()) {  
  38.             if (!socket.isOutputShutdown()) {  
  39.                 out.println(msg);  
  40.             }  
  41.         }  
  42.     }  
  43.   
  44.     public static void main(String[] args) {  
  45.         try {  
  46.             //把虚拟机的8090端口绑定到PC本机的8080端口,这样当PC向8080发送数据时实际上是发到虚拟机的8090端口  
  47.             //Runtime.getRuntime().exec(G3ExpPCclient.adb_path + " –s emulator-5554 forward tcp:8080 tcp:8090");这个方法不好用  
  48.             Runtime.getRuntime().exec(G3ExpPCclient.adb_path + " forward tcp:8080 tcp:8090");//这个好用  
  49.             System.out.println("已经将虚拟机端口8090绑定到PC端口8080 "+adb_path);  
  50.         } catch (IOException e1) {  
  51.             e1.printStackTrace();  
  52.         }  
  53.           
  54.         G3ExpPCclient pc = new G3ExpPCclient();  
  55.           
  56.          BufferedReader br = new BufferedReader(new InputStreamReader(System.in));  
  57.       
  58.         while (true) {  
  59.       
  60.             String msg="";  
  61.               
  62.             try {  
  63.                 msg = br.readLine();  
  64.                 System.out.println("将打开:" + msg);   //输入完整路径http://www.baidu.com  
  65.             } catch (IOException e) {  
  66.                 e.printStackTrace();  
  67.             }  
  68.   
  69.             if (msg.equals("exit")) {  
  70.                 System.out.println("退出");  
  71.                 System.exit(-1);  
  72.             } else {  
  73.                 pc.openUrl(msg);  
  74.             }  
  75.         }  
  76.     }  
  77. }  

 client:

 

Java代码   收藏代码
  1. /** 
  2.  * G3Exp.java 
  3.  * @author wuzq 
  4.  * @create 2012-2-21 
  5.  */  
  6. package com.warner.activity;  
  7.   
  8. import java.io.BufferedReader;  
  9. import java.io.InputStreamReader;  
  10. import java.net.ServerSocket;  
  11. import java.net.Socket;  
  12.   
  13. import android.app.Activity;  
  14. import android.content.Intent;  
  15. import android.net.Uri;  
  16. import android.os.Bundle;  
  17. import android.os.Handler;  
  18. import android.os.Message;  
  19. import android.util.Log;  
  20. import android.widget.TextView;  
  21.   
  22. public class G3Exp extends Activity {  
  23.     // 定义侦听端口号  
  24.     private final int SERVER_PORT = 8090;  
  25.     private TextView textView;  
  26.     private String content = "";  
  27.       
  28.       
  29.     @Override  
  30.     public void onCreate(Bundle savedInstanceState) {  
  31.         super.onCreate(savedInstanceState);  
  32.         setContentView(R.layout.g3exp);  
  33.         textView = (TextView)findViewById(R.id.g3_msg);  
  34.           
  35.         // 开一个新的线程来侦听客户端连接及发来的信息和打开相应网站  
  36.         new Thread() {  
  37.             public void run() {  
  38.                 startServer();  
  39.             }  
  40.         }.start();  
  41.     }  
  42.   
  43.     private void startServer() {  
  44.         try {  
  45.             //ServerSocket serverSocket = new ServerSocket(SERVER_PORT);  
  46.             ServerSocket serverSocket = new ServerSocket(SERVER_PORT);  
  47.             // 循环侦听客户端连接请求  
  48.             while (true) {  
  49.                 Socket client = serverSocket.accept();  
  50.                   
  51.                 try {  
  52.                     Log.e("hehheh""有人来访:");  
  53.                     // 等待客户端发送打开网站的消息  
  54.                     BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream()));  
  55.                     String str = in.readLine();  
  56.                     content += str+"\n";  
  57.                     mHandler.sendMessage(mHandler.obtainMessage());  
  58.                     openUrl(str);  
  59.                 } catch (Exception e) {  
  60.                     e.printStackTrace();  
  61.                 } finally {  
  62.                     client.close();  
  63.                 }  
  64.                 Thread.sleep(3000);  
  65.             }  
  66.         } catch (Exception e) {  
  67.             e.printStackTrace();  
  68.         }  
  69.     }  
  70.   
  71.     private void openUrl(String url) {  
  72.         Uri uri = Uri.parse(url);  
  73.         Intent intent = new Intent(Intent.ACTION_VIEW, uri);  
  74.         startActivity(intent);  
  75.     }  
  76.       
  77.     public Handler mHandler = new Handler() {  
  78.         public void handleMessage(Message msg) {  
  79.             super.handleMessage(msg);  
  80.             textView.setText(textView.getText().toString()+content);  
  81.         }  
  82.     };  
  83. }  

 

   别忘了加:<uses-permission android:name="android.permission.INTERNET" />

 

 

=====================================================================================

下面是从别人那转过来的:

 

android两个模拟器之间的UDP通信

 

 

最近在做UDP、TCP通信相关的项目,在做的过程中发现:同一台电脑的两个模拟器之间不能通信,

解决方法:
1. 运行模拟器
2. 打开window 命令行
    执行:telnet localhost 5554 或者是 telnet 127.0.0.1  5554 
   5554是模拟器的端口,执行之后会进入android console
3. 在console下执行:

redir add udp :端口号:端口号

例如:
   redir add udp:22221:22221
   其中,第一个端口号是模拟器1的端口,第二个端口号是模拟器2端口。(端口映射)
   执行此命令之后,会把模拟器 22221 端口发送的数据通过本机转到模拟器的22221端口,就能从22221端口接收UDP数据包了

 

http://my.oschina.net/u/211111/blog/40117

 

 

TCPpc机与模拟器及模拟器之间通信

 

进行TCP通信的时候本机上启动两个模拟器,本机(PC)和模拟器时发现两个模拟器的IP地址都是完全一样的,所以要实现两个模拟器之间的通信,使用模拟器的IP地址是办不到的。必须进行端口映射。

    模拟器提供了一个特殊的IP,此IP的地址为10.0.2.2,此IP地址可以说等同于PC本机的IP地址127.0.0.1 。所以,通过此特殊IP地址,实现PC本机与模拟器的通信是没有问题。

首先 ,运行模拟器在命令行adb –s emulator -模拟器  forward  tcp:端口号 tcp:端口号(例如:adb –s emulator-5554 forward tcp:8080 tcp:8090)

PC-SERVER:ServerSocket server = new ServerSocket(8080);

模拟器-CLIENT:Socket socket = new Socket("10.0.2.2", 8090);

接下来是如何在两个模拟器之间进行通信:同样的先进行端口映射:adb –s emulator -模拟器  forward  tcp:端口号 tcp:端口号(先运行模拟器).代码如下:

adb –s emulator-5554 forward tcp:8080 tcp:8081

模拟器(5554)-SERVER:ServerSocket server = new ServerSocket(8080);

模拟器(5556)-CLIENT:Socket socket = new Socket("10.0.2.2", 8081);

ps:我觉得应该是:

 

模拟器(5554)-SERVER:ServerSocket server = new ServerSocket(8081);

模拟器(5556)-CLIENT:Socket socket = new Socket("10.0.2.2", 8080);

 

因为模拟器5556连接的地址10.0.2.2:8080相当于本机的127.0.0.1:8080,由于进行了端口映射本机IP8080上的连接请求都映射到5554:8081上,因此模拟器5556的请求会发送到5554上.

 

http://my.oschina.net/u/211111/blog/40057

 

 

 

Android 与 PC 之间的通信

 

当PC与手机连通时,我们可以通过Socket连接来实现PC与手机间的通信。

 

这里我们先讨论手机做为Server端、PC做为Client端的情况。

 

和其他Java Socket程序一样,只需要定义一个SocketServer即可实现Server端的监听,如下:

 

 

Java代码    收藏代码
  1. ServerSocket serverSocket = new ServerSocket(SOCKET_PORT);  

 

写Java Socket的时候,我们都知道,要连上这个Server,只需要知道Server的IP地址和Port号就可以了。这里因为手机是和PC相连的,因此麻烦就在于怎么定位这个IP地址和Port号。

 

IP地址其实也就是本机地址,而port号则需要有一点点技巧,需要用到adb工具。查看adb帮助中,有一条forward命令可以用于完全任务:

 

Html代码    收藏代码
  1. adb forward <local> <remote> - forward socket connections  
  2.                                forward specs are one of:  
  3.                                  tcp:<port>  
  4.                                  localabstract:<unix domain socket name>  
  5.                                  localreserved:<unix domain socket name>  
  6.                                  localfilesystem:<unix domain socket name>  
  7.                                  dev:<character device name>  
  8.                                  jdwp:<process pid> (remote only)  

 使用如下:

 

adb forward tcp:Local_Port tcp:Remote_Port

 

也即将本地的Local_Port端口,映射为Remote_Port端口,这里的Remote_Port即为上面的SOCKET_PORT。

 

所以Client代码可以如下实现:

 

Java代码    收藏代码
  1. String adb_path=....;  
  2.   
  3. Runtime.getRuntime().exec(adb_path + " forward tcp:LocalPort tcp:Remote_Port");  
  4.   
  5. Socket socket = new Socket("localhost", Local_Port);  

即可实现PC与Android之间的通信。这里注意Android端需要有网络访问的权限:

 

Java代码    收藏代码
  1. <uses-permission android:name="android.permission.INTERNET" />  

 

Android与PC机通讯总结 :

1. 通过ADB接口进行通信 
具体依据: 
 adb方式,需要安装手机的usb驱动,直接程序中调用adb命令。 
 wifi是端口传输,也需要调用adb 
如果是通过 wifi进行交互,设置IP通过socket就可以进行通信了。如果是使用USB则需要使用adb里面的端口重定向(端口重定向是指:在PC端通过SOCKET向手持机发送连接时,当PC尝试连接本机的127.0.0.1:2525时,当使用重定向端口号后adb forward tcp:2525 tcp:2525时,当PC尝试连接127.0.0.1:2525时,PC机会将发送此端口的数据转发至手持机)。如果想通过SOCKET方式通过USB连接手持机,可能要写一套适用的SOCKET 协议,还要补充一点的是:当把手机当作server端时则需要使用端口重定向,如果是把PC当SERVER时,则通过手持机可以直接通过SOCKET连接即可 
2. PC客户端与Android服务端的Socket同步通信(USB),通讯的具体过程及实现方法,请查看内嵌文件 

3. PC机作为服务端与Android间的通信,具体实现方法请查看内嵌文件 

 

http://zhaoshaofang.iteye.com/blog/1051548

 

 

android开发中,android虚拟机作为服务器与pc客户端实现socket网络通讯中,android虚拟机的ip是多少?

android施用的仅只施用了pc 里边的1个端口

ip自然就是127.0.0.1了,或者是localhost吧

关于5037口和5555口,找到了1个看起来合理的解释:

adb(android debug bridge)包括三个部门:

1)adb client, 运行在pc上(为ddms,即ide工作)

2)adb daemon(守护进程项), 运行于emulator(为与emulator中的vm交互工作);

3)adb server(服务进程项), 运行在pc(任务管理器上有),管理着adb client和adb daemon的通讯.server与client通讯的端口是是5037,

adb server会与emulator交互的,施用的端口有两个,1个是5554专门用于与emulator实例的连接,那末数据可以从emulator转发给ide控制台了,另1个则是5555,专门与adb daemon连接为后面调试施用。

127.0.0.1

从exlipse启动的android虚拟机访问本机上的ip:10.0.2.2

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值