android虚拟机和Pc或二个虚拟机Socket通信

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

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

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

server:

Java代码 收藏代码
  1. /**
  2. *Server.java
  3. *@authorwuzq
  4. *@create2012-2-21
  5. */
  6. packagecom.warner.client;
  7. importjava.io.BufferedReader;
  8. importjava.io.BufferedWriter;
  9. importjava.io.Console;
  10. importjava.io.IOException;
  11. importjava.io.InputStreamReader;
  12. importjava.io.OutputStreamWriter;
  13. importjava.io.PrintWriter;
  14. importjava.net.Socket;
  15. publicclassG3ExpPCclient{
  16. publicstaticfinalStringadb_path="E:\\android-sdk-windows\\tools\\adb";//adb所在路径
  17. privatestaticfinalStringHOST="localhost";
  18. privatestaticfinalintPORT=8080;
  19. privateSocketsocket=null;
  20. privateBufferedReaderin=null;
  21. privatePrintWriterout=null;
  22. publicG3ExpPCclient(){
  23. try{
  24. socket=newSocket(HOST,PORT);
  25. in=newBufferedReader(newInputStreamReader(socket.getInputStream()));
  26. out=newPrintWriter(newBufferedWriter(newOutputStreamWriter(socket.getOutputStream())),true);
  27. }catch(IOExceptionex){
  28. ex.printStackTrace();
  29. System.out.println("loginexception"+ex.getMessage());
  30. }
  31. }
  32. publicvoidopenUrl(Stringmsg){
  33. if(socket.isConnected()){
  34. if(!socket.isOutputShutdown()){
  35. out.println(msg);
  36. }
  37. }
  38. }
  39. publicstaticvoidmain(String[]args){
  40. try{
  41. //把虚拟机的8090端口绑定到PC本机的8080端口,这样当PC向8080发送数据时实际上是发到虚拟机的8090端口
  42. //Runtime.getRuntime().exec(G3ExpPCclient.adb_path+"–semulator-5554forwardtcp:8080tcp:8090");这个方法不好用
  43. Runtime.getRuntime().exec(G3ExpPCclient.adb_path+"forwardtcp:8080tcp:8090");//这个好用
  44. System.out.println("已经将虚拟机端口8090绑定到PC端口8080"+adb_path);
  45. }catch(IOExceptione1){
  46. e1.printStackTrace();
  47. }
  48. G3ExpPCclientpc=newG3ExpPCclient();
  49. BufferedReaderbr=newBufferedReader(newInputStreamReader(System.in));
  50. while(true){
  51. Stringmsg="";
  52. try{
  53. msg=br.readLine();
  54. System.out.println("将打开:"+msg);//输入完整路径http://www.baidu.com
  55. }catch(IOExceptione){
  56. e.printStackTrace();
  57. }
  58. if(msg.equals("exit")){
  59. System.out.println("退出");
  60. System.exit(-1);
  61. }else{
  62. pc.openUrl(msg);
  63. }
  64. }
  65. }
  66. }

client:

Java代码 收藏代码
  1. /**
  2. *G3Exp.java
  3. *@authorwuzq
  4. *@create2012-2-21
  5. */
  6. packagecom.warner.activity;
  7. importjava.io.BufferedReader;
  8. importjava.io.InputStreamReader;
  9. importjava.net.ServerSocket;
  10. importjava.net.Socket;
  11. importandroid.app.Activity;
  12. importandroid.content.Intent;
  13. importandroid.net.Uri;
  14. importandroid.os.Bundle;
  15. importandroid.os.Handler;
  16. importandroid.os.Message;
  17. importandroid.util.Log;
  18. importandroid.widget.TextView;
  19. publicclassG3ExpextendsActivity{
  20. //定义侦听端口号
  21. privatefinalintSERVER_PORT=8090;
  22. privateTextViewtextView;
  23. privateStringcontent="";
  24. @Override
  25. publicvoidonCreate(BundlesavedInstanceState){
  26. super.onCreate(savedInstanceState);
  27. setContentView(R.layout.g3exp);
  28. textView=(TextView)findViewById(R.id.g3_msg);
  29. //开一个新的线程来侦听客户端连接及发来的信息和打开相应网站
  30. newThread(){
  31. publicvoidrun(){
  32. startServer();
  33. }
  34. }.start();
  35. }
  36. privatevoidstartServer(){
  37. try{
  38. //ServerSocketserverSocket=newServerSocket(SERVER_PORT);
  39. ServerSocketserverSocket=newServerSocket(SERVER_PORT);
  40. //循环侦听客户端连接请求
  41. while(true){
  42. Socketclient=serverSocket.accept();
  43. try{
  44. Log.e("hehheh","有人来访:");
  45. //等待客户端发送打开网站的消息
  46. BufferedReaderin=newBufferedReader(newInputStreamReader(client.getInputStream()));
  47. Stringstr=in.readLine();
  48. content+=str+"\n";
  49. mHandler.sendMessage(mHandler.obtainMessage());
  50. openUrl(str);
  51. }catch(Exceptione){
  52. e.printStackTrace();
  53. }finally{
  54. client.close();
  55. }
  56. Thread.sleep(3000);
  57. }
  58. }catch(Exceptione){
  59. e.printStackTrace();
  60. }
  61. }
  62. privatevoidopenUrl(Stringurl){
  63. Uriuri=Uri.parse(url);
  64. Intentintent=newIntent(Intent.ACTION_VIEW,uri);
  65. startActivity(intent);
  66. }
  67. publicHandlermHandler=newHandler(){
  68. publicvoidhandleMessage(Messagemsg){
  69. super.handleMessage(msg);
  70. textView.setText(textView.getText().toString()+content);
  71. }
  72. };
  73. }

别忘了加:<uses-permissionandroid: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. ServerSocketserverSocket=newServerSocket(SOCKET_PORT);

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

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

Html代码 收藏代码
  1. adbforward<local><remote>-forwardsocketconnections
  2. forwardspecsareoneof:
  3. tcp:<port>
  4. localabstract:<unixdomainsocketname>
  5. localreserved:<unixdomainsocketname>
  6. localfilesystem:<unixdomainsocketname>
  7. dev:<characterdevicename>
  8. jdwp:<processpid>(remoteonly)

使用如下:

adbforward tcp:Local_Port tcp:Remote_Port

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

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

Java代码 收藏代码
  1. Stringadb_path=....;
  2. Runtime.getRuntime().exec(adb_path+"forwardtcp:LocalPorttcp:Remote_Port");
  3. Socketsocket=newSocket("localhost",Local_Port);

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

Java代码 收藏代码
  1. <uses-permissionandroid: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

你可能感兴趣的:(socket通信)