文档章节

Android “adb forward”端口映射

开源中国VIP
 开源中国VIP
发布于 2013/07/10 14:45
字数 774
阅读 9394
收藏 16

简析adb的端口映射功能,将PC端的某端口数据重定向到手机端的一个端口

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

曾经以为adb forward是个好东东,因为通过这个映射之后,在PC和设备之间就可以直接socket通信了。可现在终于发现,世界不是完美的。

Android Debug Bridge设计的目的,一是用来管理所有连接的设备;二是提供各种服务,供PC端有效的控制设备。主要包括三个部分:

1) ADB-server

运行在PC端,是一个始终在后台运行的进程,作为与手机端交互的唯一接口。ADB-server处理ADB-client的请求,一部分请求无须与 设备交互,直接在PC本地完成;剩下的请求需要与设备端的adbd交互,ADB-server起到了一个switcher的作用。

2) ADB-client

运行在PC端,可以同时存在多个。每个ADB-client由用户启动,完成多种功能。其作用是与ADB-server交互,实现用户请求的功能。

3) adbd

运行在设备端的常驻进程,同时只存在一个。作用是接收PC端的ADB-server发来的请求,并作出对应操作。

这三个可执行程序都是同一套代码编译出来的,位于<Android Source Dir>/system/core/adb/

ADB-client和ADB-server对应同一个可执行文件“adb(.exe)”,编译时有-DADB_HOST=1宏。而adbd对应目 标设备上的可执行文件"adbd",编译时的参数是-DADB_HOST=0。

.              P  C                                                                                    Device
--------------------------------------                                        -------------------------------------
[ADB-client]<----->[Port A:]                                         [:Port A']<------>[Program A]
[ADB-client]<----->[Port B:]ADB-server<----->adbd[:Port B']<------>[Program B]
[ADB-client]<----->[Port C:]                                         [:Port C']---------(empty)
.                               |<--------Android Debug Bridge---------->|

(这个图实在是调不好了,不管了)

ADB提供了PC与设备交互的桥梁,结构上清晰明了。其中adb forward功能提供了端口映射,希望给用户提供透明的socket通信。但可惜,这与真实的网络socket有点区别。

在TCP网络编程中,Client的Socket(C)如果调用Connect()成功,就说明已经和Server端的Socket(S)连接上, 可以通讯了。但是如果使用adb forward做端口映射,就不一样了。端口映射的实质是,让ADB-server作为一个switcher转发ADB-client的数据包,送给 adbd,adbd再发给设备端的对应端口。因此一旦建立了映射,就相当于ADB-server开始监听这个目标端口。而此时如果有C去尝试 Connect这个端口,是一定会成功的,因为与C连接的是ADB-server,而非真正的设备上的目标程序。这就出现了,即使Connect()成 功,却完全无法知道究竟是否成功连接到S。

因此,判断真正连接成功的方法,只有轮询收发握手数据包。程序中约定好事先做个交互:C发送一个数据包,等待S回复;C如果收到了S的回复包,说明 连通;如果接收超时,则认为没有连通。在没有连通的情况下,需要重新建立Socket,并Connect(),然后再尝试握手。

本文转载自:http://mandapeng.vip.zhourenjian.com/?p=7

开源中国VIP
粉丝 7
博文 8
码字总数 849
作品 0
深圳
程序员
私信 提问
加载中

评论(2)

微软技术支持
微软技术支持
博主你好!能否做个简单的demo
野薯
野薯
h
android socket各种通信

我已经试验成功: ps:模拟器做服务器,PC机做客户端。如果通过wifi连接的话直接访问IP就行,不用重定向。 PC访问模拟器用localhost即127.0.0.1, 模拟器 访问 模拟器用10.0.2.2 本人已成功运...

buleberry
2014/04/01
157
0
PC电脑和Android模拟器访问及模拟器之间tcp/udp通信

Android系统默认只能通过IP(10.0.2.2)单向访问PC电脑,而PC电脑不能通过IP来直接访问Android模拟器系统。要想实现PC电脑和Android模拟器系统以及Android模拟器之间相互通信必须借助端口重定...

小克898
2013/09/06
1K
0
局域网内通过无线实现android设备的socket通信

我们就用最简单的socket编程吧,一个做client端一个server端。然后分析一下有几种连接情况: ANDROID与PC : android与android: 这两个是最简单的,不需要端口重定向,在无线网内肯定都有i...

我不是咸蛋
2012/08/30
11K
6
drozer安装和使用——android***测试

一、drozer安装包 把Drozer工具包drozer-installer-2.3.4.zip解压后看到的目录如下图,其中setup.exe文件是安装在PC机上面的,agent.apk是安装在手机模拟器或者移动手机里面的。 二、PC机上面...

老鹰a
2018/06/29
0
0
Android adb forward转发TCP端口连接数据

版权声明:本文为Zhang Phil原创文章,请不要转载! https://blog.csdn.net/zhangphil/article/details/89358894 Android adb的一个命令 : adb forward,该命令转发PC电脑上的端口数据到And...

zhangphil
05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

经典系统设计面试题解析:如何设计TinyURL(二)

原文链接:https://www.educative.io/courses/grokking-the-system-design-interview/m2ygV4E81AR 编者注:本文以一道经典的系统设计面试题:《如何设计TinyURL》的参考答案和解析为例,帮助...

APEMESH
12分钟前
7
0
使用logstash同步MySQL数据到ES

概述   在生成业务常有将MySQL数据同步到ES的需求,如果需要很高的定制化,往往需要开发同步程序用于处理数据。但没有特殊业务需求,官方提供的logstash就很有优势了。   在使用logstas...

zxiaofan666
22分钟前
4
0
X-MSG-IM-分布式信令跟踪能力

经过一周多的鏖战, X-MSG-IM的分布式信令跟踪能力已基本具备, 特点是: 实时. 只有要RX/TX就会实时产生信令跟踪事件, 先入kafka, 再入influxdb待查. 同时提供实时sub/pub接口. 完备. 可以完整...

dev5
32分钟前
6
0
OpenJDK之CyclicBarrier

OpenJDK8,本人看的是openJDK。以前就看过,只是经常忘记,所以记录下 图1 CyclicBarrier是Doug Lea在JDK1.5中引入的,作用就不详细描述了,主要有如下俩个方法使用: await()方法,如果当前线...

克虏伯
35分钟前
6
0
实战项目-学成在线(八)

在前后端分离架构中,服务层被拆分成了很多的微服务,微服务的信息如何管理?Spring Cloud中提供服务注册中心来管理微服务信息。 注册中心作用: 1、微服务数量众多,要进行远程调用就需要知...

lianbang_W
36分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部