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

我已经试验成功:

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 = "";@Overridepublic 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-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


更多相关文章

  1. [Android]Service和Activity双向通信的两种方式
  2. android netd和kernel&frameworks的通信逻辑
  3. Android中Messenger原理及基本用法详解
  4. Android(安卓)常用的adb命令
  5. Android(安卓)WiFi直连 双向通信
  6. Android(安卓)Linux开发准备
  7. Arcgis api for android V2.0模拟器调试问题
  8. 安卓android模拟器使用命令行
  9. Socket(TCP)

随机推荐

  1. 你是魔鬼吗?Steam上线「科研模拟器」游戏,
  2. 让图像识别准确率瞬间下降40个点,「江苏卷
  3. Docker compose 配置 Snipe IT 练习
  4. C语言数据存储
  5. js的增删查改的DOM操作
  6. 2021-04-07:给定一个非负数组arr,长度为N,那
  7. 苹果iPhone 12 Pro丢了或被偷了怎么定位
  8. 【js效果】下拉菜单
  9. 史上最全最新微信小程序自动化教程
  10. 20210221-2 软件管理与网络管理