Android - adb forward实现PC和App的Socket通讯

PC端的XX助手和手机App的通讯原理:

# 把PC端8000端口的数据, 转发到Android端的9000端口上.
adb forward tcp:8000 tcp:9000

 什么是转发?

 

 

执行命令后, PC端的8000端口会被 adb
监听, 这个时候我们只需要往8000端口写数据, 这个数据就会发送到手机端的9000端口上.

PC端程序

把输入内容发送给8000端口

 

public class PCClient {
    public static void main(String[] args) throws IOException {
        System.out.println("任意字符, 回车键发送Toast");
        Scanner scanner = new Scanner(System.in);
        while (true) {
            String msg = scanner.next();
            sendToast(msg);
        }
    }
    public static void sendToast(String msg) throws IOException {
        Socket socket = new Socket("127.0.0.1", 8000);
        DataInputStream dis = new DataInputStream(socket.getInputStream());
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF(msg);
        socket.close();
    }
}

 

Android端程序

监听9000端口, 把收到的数据, Toast在屏幕上

 

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "ServerThread";
    ServerThread serverThread;
    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            Toast.makeText(getApplicationContext(), msg.getData().getString("MSG", "Toast"), Toast.LENGTH_SHORT).show();
        }
    };
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        serverThread = new ServerThread();
        serverThread.start();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        serverThread.setIsLoop(false);
    }
    class ServerThread extends Thread {
        boolean isLoop = true;
        public void setIsLoop(boolean isLoop) {
            this.isLoop = isLoop;
        }
        @Override
        public void run() {
            Log.d(TAG, "running");
            ServerSocket serverSocket = null;
            try {
                serverSocket = new ServerSocket(9000);
                while (isLoop) {
                    Socket socket = serverSocket.accept();
                    Log.d(TAG, "accept");
                    DataInputStream inputStream = new DataInputStream(socket.getInputStream());
                    DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
                    String msg = inputStream.readUTF();
                    Message message = Message.obtain();
                    Bundle bundle = new Bundle();
                    bundle.putString("MSG", msg);
                    message.setData(bundle);
                    handler.sendMessage(message);
                    socket.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                Log.d(TAG, "destory");
                if (serverSocket != null) {
                    try {
                        serverSocket.close();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
}

 

运行效果



 

源码

Android-Pc-Socket-Connection

实际开发中的问题

  1. Android端的程序 有可能被干掉
  2. adb forward 有可能会被干掉

由于连接不稳定性,判断真正连接成功的方法,只有轮询收发握手数据包:
C发送一个数据包,等待S回复;
C如果收到了S的回复包,说明连通。
如果接收超时,则认为没有连通.
在没有连通的情况下,需要重新建立Socket,并Connect(),然后再尝试握手。

作者:口袋FPV
链接:http://www.jianshu.com/p/fee5b31774be
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
<think>我们面对的问题是如何在PC端通过ADB连接使用Socket的安卓设备。根据引用内容,我们可以整理出几个关键步骤: 1. **启动ADB服务**:首先确保PC端的ADB服务已启动。 2. **获取设备root权限**(可选):某些操作可能需要root权限。 3. **端口重定向**:使用`adb forward`命令将PC端的端口重定向到安卓设备的端口,这样PC端就可以通过该端口与安卓设备上的Socket服务通信。 4. **建立Socket连接**:PC端作为客户端连接重定向后的端口,与安卓设备上的Socket服务进行通信。 具体步骤: ### 1. 启动ADB服务 在PC上打开命令行,输入: ```bash adb start-server ``` ### 2. 连接设备 确保安卓设备通过USB连接到PC,并已开启USB调试模式。可以通过`adb devices`命令查看设备是否已连接。 ### 3. 端口重定向 使用`adb forward`命令进行端口重定向,格式为: ```bash adb forward tcp:<PC端口> tcp:<设备端口> ``` 例如,将PC的6100端口重定向到设备的7100端口: ```bash adb forward tcp:6100 tcp:7100 ``` ### 4. 在安卓设备上运行Socket服务 确保安卓设备上有一个Socket服务程序正在监听重定向的端口(例如7100端口)。这个服务程序可以是你自己开发的,也可以是系统提供的服务。 ### 5. PC端通过Socket连接 PC端使用任何支持Socket编程的语言(如Python、Java等)连接到本地的重定向端口(例如6100)。例如,在Python中: ```python import socket # 连接到本地重定向的端口 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect(('127.0.0.1', 6100)) # 注意这里连接的是PC本地的端口 # 发送数据 s.send(b'Hello from PC!') # 接收数据 data = s.recv(1024) print('Received:', data) # 关闭连接 s.close() ``` ### 注意事项 - 如果有多台PC连接同一台安卓设备,可能会遇到设备状态为OFFLINE的问题(引用[2])。这通常是因为ADB的并发连接限制。解决方法可能是修改ADBD代码或确保每次只有一台PC连接。 - 如果安卓设备作为服务端,那么需要确保设备上的Socket服务已经启动并监听指定端口。而PC端作为客户端连接。 - 权限:安卓应用需要网络权限(引用[4]),在AndroidManifest.xml中添加: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` ### 引用说明 [^1]: 引用[1]提供了ADB基本命令端口重定向的示例。 [^2]: 引用[2]提到多台PC连接同一设备时可能出现的问题及解决方案。 [^3]: 引用[3]描述了Android设备通过USB与PC进行Socket通信的场景消息类型。 [^4]: 引用[4]强调了网络权限的重要性。 ### 相关问题 1. 如何通过ADBPC安卓设备之间传输文件? 2. 如何解决多台PC同时连接同一安卓设备时的ADB冲突问题? 3. 安卓设备作为Socket服务端客户端有什么区别? 4. 如何编写一个简单的安卓Socket服务程序?</think>### PC端通过ADB连接基于Socket的安卓设备指南 要实现PC端通过ADB连接使用Socket的安卓设备,需要执行以下关键步骤: #### 1. **启动ADB服务并连接设备** ```bash # 启动ADB服务 adb start-server # 连接设备(USB模式) adb devices # 确认设备已识别 ``` #### 2. **设置端口重定向(核心步骤)** ```bash # 将PC端口重定向到安卓设备的Socket端口 adb forward tcp:<PC端口> tcp:<安卓端口> ``` 例如重定向PC的6100端口到安卓的7100端口: ```bash adb forward tcp:6100 tcp:7100 ``` **原理**:所有发送到PC端6100端口的数据会自动转发到安卓设备7100端口的Socket服务[^1]。 #### 3. **PCSocket通信实现(Python示例)** ```python import socket # 连接到重定向端口(注意使用本地地址) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('127.0.0.1', 6100)) # 连接PC本机重定向端口 # 发送数据(将自动转发到安卓设备) sock.send(b"Hello from PC!") # 接收安卓返回的数据 response = sock.recv(1024) print("Received:", response.decode()) sock.close() ``` #### 4. **安卓端配置要求 - **权限声明**:在`AndroidManifest.xml`中添加: ```xml <uses-permission android:name="android.permission.INTERNET" /> ``` - **Socket服务**:安卓设备需运行Socket服务程序并监听指定端口(如7100)[^4]。 #### 5. **多设备连接处理(可选)** 当多台PC连接同一设备时: 1. 修改设备端`adbd`代码解决冲突(需系统权限)[^2] 2. 或使用不同端口分别重定向: ```bash # PC1 adb -s <device_id> forward tcp:6100 tcp:7100 # PC2 adb -s <device_id> forward tcp:6200 tcp:7100 ``` #### 6. **关闭连接** ```bash # 结束通信后关闭ADB服务 adb kill-server ``` ### 注意事项 1. 确保安卓设备已开启USB调试模式 2. 首次连接需在设备上授权ADB调试 3. 防火墙需允许ADB通信(默认端口5037) 4. 数据传输大小限制:单次传输建议不超过4KB > **替代方案**:若需WiFi连接,先通过USB执行`adb tcpip 5555`开启网络ADB,再使用设备IP连接: > ```bash > adb connect <设备IP>:5555 > adb forward tcp:6100 tcp:7100 > ``` [^1]: PC与手机app通过ADB建立socket通信 传文件 android 常用adb指令 [^2]: 多台PC网络ADB连接同一台RK3399 Android7.1.2设备 [^4]: androidPC(Python)通过USB(adb模式)基于Socket传输图像(视频) --- ### 相关问题 1. **ADB端口重定向失败有哪些常见原因?如何排查?** 2. **如何实现安卓设备主动向PC发送Socket消息?** 3. **ADB over WiFi与USB连接在Socket通信中的性能差异?** 4. **如何通过ADB转发UDP端口实现音视频传输?**
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值