通过usb利用adb实现android手机和pc机通信

这篇具有很好参考价值的文章主要介绍了通过usb利用adb实现android手机和pc机通信。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、 adb forward 原理概述
adb forward 的功能是建立一个转发
如:adb forward tcp:8000 tcp:9000 的意思是,将PC端的 8000 端口收到的数据,转发给手机中的 9000 端口。
但是光执行这个命令还不能转发数据,还需要完成下面两个步骤才能传数据:

(a)在手机端,建立一个端口为9000的 server,并打开 server 到监听状态。
(b)在PC端,建立一个 socket client 端,连接到端口为8000的 server 上。
adb forward tcp:8000 tcp:9000 原理示意图:
安卓设备通过usb接口实现与pc端的简单数据通信,android,android,adb
PC端应用与手机端应用 通信建立过程:
(1)执行 adb forward tcp:8000 tcp:9000
(2)启动手机端应用,建立端口为9000的 server,并处于监听状态(LISTENING)
(3)启动PC端应用,连接端口为8000的 server(adb 创建的)之后,就可以传输数据了
PC端代码====


private static boolean mRunning = true;

    public static void main(String[] args) {
        if (!setupAdbForward()) {
            System.out.println("设置端口转发失败");
            return;
        } else {
            System.out.println("端口转发设置完成");
        }
        System.out.println("任意字符, 回车键发送");
        startClient();
    }

    private static boolean setupAdbForward() {
        try {
            // todo 将PC端8000端口的数据, 转发到Android端的9000端口上
            String device = "adb devices";
            Process process = Runtime.getRuntime().exec(new String[]{"cmd", "/c", device});
            int ret = process.waitFor();
            System.out.println("cmy 111:" + device + ";" + ret);
            String forward = "adb forward tcp:8000 tcp:9000";
            process = Runtime.getRuntime().exec(new String[]{"cmd", "/c", forward});
            process.waitFor();
            System.out.println("cmy 222:" + forward + ";" + ret);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
        }

        return false;
    }

    private static void startClient() {
        try {
            //设置pc端的端口为8000
            Socket socket = new Socket("127.0.0.1", 8000);
            // InThread 接收手机端传来的数据
            new Thread(new InThread(socket)).start();
            // OutThread 用于从PC端输入并传给手机端
            Scanner scanner = new Scanner(System.in);
            while (true) {
                String msg = scanner.next();
                sendToServer(socket, msg);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 接收手机端传来的数据
     */
    static class InThread implements Runnable {
        Socket socket;

        public InThread(Socket socket) {
            this.socket = socket;
        }

        @Override
        public void run() {
            while (mRunning) {
                if (socket.isClosed()) {
                    mRunning = false;
                    break;
                }
                try {
                    DataInputStream dis = new DataInputStream(socket.getInputStream());
                    byte[] buffer = new byte[256];
                    int len = dis.read(buffer);
                    if (len > 0) {
                        System.out.println("\n接收到:" + new String(buffer, 0, len, "UTF-8"));
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 从PC端输入并传给手机端
     *
     * @param msg 信息
     * @throws IOException 异常
     */
    public static void sendToServer(Socket socket, String msg) throws IOException {
        DataOutputStream dos = new DataOutputStream(socket.getOutputStream());
        dos.writeUTF(msg);
        dos.flush();
        try {
            Thread.sleep(1000L);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

PC端应用与手机端应用之间传输数据的过程:
(1)PC端应用将数据发送给端口为8000的 server(adb 创建的)
(2)adb 将数据转发给手机端 adbd 进程(通过USB传输)
(3)adbd 进程将数据发送给端口为9000的 server(手机端应用创建的)传递是双向的,
第(1)和第(3)步是通过socket实现的,所以通过 socket 的读和写就完成了PC端和手机端的数据传递。
=======andorid 端代码=文章来源地址https://www.toymoban.com/news/detail-816181.html

public class ServerThread extends Thread {
    private static final String SERVER_TAG = "server";
    private ServerSocket serverSocket;
    private Socket socket;
    boolean isLoop = true;

    public Socket getSocket() {
        return socket;
    }

    @Override
    public void run() {
        super.run();
        try {
            //设置Android端口为9000
            serverSocket = new ServerSocket(9000);
            while (isLoop) {
                try {
                    //从连接队列中取出一个连接,如果没有则等待
                    socket = serverSocket.accept();
                    Log.v(SERVER_TAG, "从连接队列中取出一个连接");
                    EventBus.getDefault().post(new MessageType("发现一个新的客户端加入:"));
                    while (true) {
                        /**
                         * isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()
                         * 这些方法无法判断服务端是否断开,只能判断本地的状态
                         */
                        // 发送心跳包,单线程中使用,判断socket是否断开
                        socket.sendUrgentData(0xFF);
                        DataInputStream inputStream = new DataInputStream(socket.getInputStream());
                        byte[] buffer = new byte[1024];
                        int bt;
                        String text = "";
                        int index = 0;
                        Log.v(SERVER_TAG, "inputStream.read 之前");
                        while ((bt = inputStream.read(buffer)) != -1) {
                            Log.v(SERVER_TAG, "bt:" + bt + ",," + (index++));
                            text += new String(buffer, 0, bt).trim();
                            Log.e(SERVER_TAG, "------------");
                            Log.e(SERVER_TAG, "text: " + text.trim());
                            /**
                             * 当接收到大数据,inputStream读取完后,由于inputStream通道是一直在的,
                             * inputStream.read(buffer)处在堵塞状态,所以并不会跳出当前循环,
                             * 导致无法判断数据是否传输完,所以PC端传输数据时需要在数据中
                             * 加入报尾,Android设备上接收到报尾,代表此次数据传输完毕,
                             * 也可以加上报头,来表示数据的开始
                             *
                             */
                            if (text.endsWith("-vvv")) {
                                EventBus.getDefault().post(new MessageType("接收:" + text));
                                text = text.substring(0, text.lastIndexOf("-vvv"));
                                Log.v(SERVER_TAG, "内容长度:" + text.length());
                                Log.v(SERVER_TAG, "读取结束,内容为:" + text);
                                Log.v(SERVER_TAG, "inputStream.read 之后");
                                break;
                            }
                        }
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                    EventBus.getDefault().post(new MessageType("接收:异常"));
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
public class SendThread extends Thread {
    private String data;
    private Socket socket;

    public SendThread(String data, Socket socket) {
        this.data = data + "-vvv";
        this.socket = socket;
    }

    @Override
    public void run() {
        super.run();
        sendDatas();
    }

    private void sendDatas() {
        try {
            DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream());
            outputStream.write(data.getBytes("UTF-8"));
            outputStream.flush();
            LogUtils.e("发送:" + data);
            EventBus.getDefault().post(new MessageType("发送:" + data));
        } catch (IOException e) {
            e.printStackTrace();
            EventBus.getDefault().post(new MessageType("发送:异常"));
        }
    }
}

到了这里,关于通过usb利用adb实现android手机和pc机通信的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 蓝牙通信 Android开发实现手机间通过蓝牙传输文件

    MainActivity.java 根据以上代码的结构和功能,我会将它们分为以下几部分: 权限请求和检查 requestPermissions() 方法 checkLocationPermission() 方法 onRequestPermissionsResult() 方法 初始化和设置 onCreate() 方法 onStart() 方法 onActivityResult() 方法 蓝牙设备搜索和配对 discoverDevices() 方法 与列表交互

    2024年03月27日
    浏览(50)
  • Android(安卓) 无线ADB调试手机(WiFi 调试、蓝牙调试)

    1. 手机和电脑连接同一局域网(连同一个 WiFi、手机开热点电脑连接、电脑开热点手机连接) 2.手机打开USB调试模式 3. 查找你需要连接的Android(安卓)设备的ip (方式一)手机开热点电脑连接(手机分享蓝牙网络给电脑连接): 1)电脑打开cmd窗口(win+R) 输入: 2)在cmd里面输入:

    2024年02月09日
    浏览(66)
  • Android Studio配置adb使用WIFI连接手机调试安卓程序

    安装adb参考:https://www.linmeimei.top/2023/03/02/flutter-adb 手机设置 打开开发者模式(用HUAWEI举例) 【设置】→【关于手机】→【版本号】→ 连续点击5次即可进入开发者模式 打开USB调试 【设置】→【系统和更新】→【开发人员选项】→开启【USB调试】开关→开启【\\\"仅充电\\\"模式下允许

    2024年02月04日
    浏览(52)
  • 【Android】通过命令行adb install 将apk下载到手机之中

    mac 电脑中有一个apk,想将该apk下载install到Android手机中。 首先在手机中删除原有的apk,然后再连上数据线到电脑中(我是在Android studio的命令行)进行如下的命令行: 路径按照实际的输入即可

    2024年02月11日
    浏览(60)
  • Android Studio制作手机App:通过手机蓝牙(Bluetooth)与STM32上的低功耗蓝牙(HC-42)连接通信,实现手机端对单片机的控制。

    背景: 本文的内容是针对单片机蓝牙模块(HC-42)开发的手机App。在这之前,我想先声明一点,手机与手机间的蓝牙连接方式”与“手机与HC间的蓝牙连接方式”是不一样的。原因就是手机搭配的是“经典蓝牙”模块,HC等蓝牙属于“低功耗蓝牙”模块。(二者的区别想了解的

    2024年02月04日
    浏览(51)
  • 安卓USB调试和无线调试ADB安装apk

    widows10系统 ## Android 设备通过usb连接开启ADB安装APK 1.开启开发者模式 操作步骤:进入设置并选择关于手机。找到版本号并点击7次,屏幕会出现提示您现在处于开发者模式。 2.开启USB调试 操作步骤: 返回到设置并点击开发者选项,选择 启用USB调试 ,再次返回到设置并点击安

    2024年02月05日
    浏览(47)
  • 在Android Studio通过adb命令强制安装debug版本apk到手机,且允许version code降级

    在Android Studio通过adb命令强制安装debug版本apk到手机,且允许version code降级 切换到Terminal: .appbuildintermediatesapkdebug是android studio的apk编译生成路径。 参数: -t   允许安装测试包 -d   运行version code 降级 -r   取代现有application -g  授予所有权限       adb命令导出手机已安

    2024年02月14日
    浏览(65)
  • Android 13.0 通过驱动实现禁用usb鼠标和usb键盘功能

    在13.0的系统产品定制化开发中,在进行定制中有关于usb键盘和usb鼠标的需求中,产品要求禁止usb口挂载usb鼠标和usb键盘,所以需要要求在usb挂载类型的时候 判断如果是usb鼠标和usb键盘就不让挂载,这就需要从驱动方面入手来解决这个问题,接下来看下驱动的某些挂载usb的相

    2024年02月08日
    浏览(57)
  • Android 12.0 通过驱动实现禁用usb鼠标和usb键盘功能

    在12.0的系统产品定制化开发中,在进行定制中有关于usb键盘和usb鼠标的需求中,产品要求禁止usb口挂载usb鼠标和usb键盘,所以需要要求在usb挂载类型的时候 判断如果是usb鼠标和usb键盘就不让挂载,这就需要从驱动方面入手来解决这个问题,接下来看下驱动的某些挂载usb的相

    2024年02月08日
    浏览(106)
  • 华为手机USB连接成功,ADB识别失败

    数据线断开重连 同一 wifi adb 查连接设备 连接模式是文件传输 开发者模式关闭打开 USB调试关闭打开 USB调试下ADB开关之类的 手机重启 排查数据线 排查电脑、手机(就华为不行 连接手机电脑自动弹出安装界面 双击安装,未成功 使用管理员权限安装,未成功 去官网下载一个,

    2024年02月13日
    浏览(124)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包