?
=====================================================================================
我已经试验成功:
?ps:模拟器做服务器,PC机做客户端。如果通过wifi连接的话直接访问IP就行,不用重定向。
? ? ? PC访问模拟器用localhost即127.0.0.1,模拟器?访问模拟器用10.0.2.2
? ? ? 本人已成功运行,看你的RP了- -
server:
?
/** * Server.java * @author wuzq * @create 2012-2-21 */package com.warner.client;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.Console;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.PrintWriter;import java.net.Socket;public class G3ExpPCclient { public static final String adb_path= "E:\\android-sdk-windows\\tools\\adb ";//adb所在路径 private static final String HOST = "localhost"; private static final int PORT = 8080; private Socket socket = null; private BufferedReader in = null; private PrintWriter out = null; public G3ExpPCclient() { try { socket = new Socket(HOST, PORT); in = new BufferedReader(new InputStreamReader(socket.getInputStream())); out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true); } catch (IOException ex) { ex.printStackTrace(); System.out.println("login exception" + ex.getMessage()); } } public void openUrl(String msg) { if (socket.isConnected()) { if (!socket.isOutputShutdown()) { out.println(msg); } } } public static void main(String[] args) { try { //把虚拟机的8090端口绑定到PC本机的8080端口,这样当PC向8080发送数据时实际上是发到虚拟机的8090端口 //Runtime.getRuntime().exec(G3ExpPCclient.adb_path + " –s emulator-5554 forward tcp:8080 tcp:8090");这个方法不好用 Runtime.getRuntime().exec(G3ExpPCclient.adb_path + " forward tcp:8080 tcp:8090");//这个好用 System.out.println("已经将虚拟机端口8090绑定到PC端口8080 "+adb_path); } catch (IOException e1) { e1.printStackTrace(); } G3ExpPCclient pc = new G3ExpPCclient(); BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); while (true) { String msg=""; try { msg = br.readLine(); System.out.println("将打开:" + msg); //输入完整路径http://www.baidu.com } catch (IOException e) { e.printStackTrace(); } if (msg.equals("exit")) { System.out.println("退出"); System.exit(-1); } else { pc.openUrl(msg); } } }}
?client:
?
/** * G3Exp.java * @author wuzq * @create 2012-2-21 */package com.warner.activity;import java.io.BufferedReader;import java.io.InputStreamReader;import java.net.ServerSocket;import java.net.Socket;import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.widget.TextView;public class G3Exp extends Activity { // 定义侦听端口号 private final int SERVER_PORT = 8090; private TextView textView; private String content = ""; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.g3exp); textView = (TextView)findViewById(R.id.g3_msg); // 开一个新的线程来侦听客户端连接及发来的信息和打开相应网站 new Thread() { public void run() { startServer(); } }.start(); } private void startServer() { try { //ServerSocket serverSocket = new ServerSocket(SERVER_PORT); ServerSocket serverSocket = new ServerSocket(SERVER_PORT); // 循环侦听客户端连接请求 while (true) { Socket client = serverSocket.accept(); try { Log.e("hehheh", "有人来访:"); // 等待客户端发送打开网站的消息 BufferedReader in = new BufferedReader(new InputStreamReader(client.getInputStream())); String str = in.readLine(); content += str+"\n"; mHandler.sendMessage(mHandler.obtainMessage()); openUrl(str); } catch (Exception e) { e.printStackTrace(); } finally { client.close(); } Thread.sleep(3000); } } catch (Exception e) { e.printStackTrace(); } } private void openUrl(String url) { Uri uri = Uri.parse(url); Intent intent = new Intent(Intent.ACTION_VIEW, uri); startActivity(intent); } public Handler mHandler = new Handler() { public void handleMessage(Message msg) { super.handleMessage(msg); textView.setText(textView.getText().toString()+content); } };}
?
? ?别忘了加:<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端的监听,如下:
?
?
- ServerSocket?serverSocket?=?new?ServerSocket(SOCKET_PORT);??
?
写Java Socket的时候,我们都知道,要连上这个Server,只需要知道Server的IP地址和Port号就可以了。这里因为手机是和PC相连的,因此麻烦就在于怎么定位这个IP地址和Port号。
?
IP地址其实也就是本机地址,而port号则需要有一点点技巧,需要用到adb工具。查看adb帮助中,有一条forward命令可以用于完全任务:
?
- adb?forward?<local>?<remote>?-?forward?socket?connections??
- ???????????????????????????????forward?specs?are?one?of:??
- ?????????????????????????????????tcp:<port>??
- ?????????????????????????????????localabstract:<unix?domain?socket?name>??
- ?????????????????????????????????localreserved:<unix?domain?socket?name>??
- ?????????????????????????????????localfilesystem:<unix?domain?socket?name>??
- ?????????????????????????????????dev:<character?device?name>??
- ?????????????????????????????????jdwp:<process?pid>?(remote?only)??
?使用如下:
?
adb?forward tcp:Local_Port tcp:Remote_Port
?
也即将本地的Local_Port端口,映射为Remote_Port端口,这里的Remote_Port即为上面的SOCKET_PORT。
?
所以Client代码可以如下实现:
?
- String?adb_path=....;??
- ??
- Runtime.getRuntime().exec(adb_path?+?"?forward?tcp:LocalPort?tcp:Remote_Port");??
- ??
- Socket?socket?=?new?Socket("localhost",?Local_Port);??
即可实现PC与Android之间的通信。这里注意Android端需要有网络访问的权限:
?
- <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
?
按照贵博的方法,的确可以连通 Android模拟器服务端-PC客户端。
膜拜!!!