国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

通過usb利用adb實現(xiàn)android手機和pc機通信

這篇具有很好參考價值的文章主要介紹了通過usb利用adb實現(xiàn)android手機和pc機通信。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

1、 adb forward 原理概述
adb forward 的功能是建立一個轉發(fā)
如:adb forward tcp:8000 tcp:9000 的意思是,將PC端的 8000 端口收到的數(shù)據(jù),轉發(fā)給手機中的 9000 端口。
但是光執(zhí)行這個命令還不能轉發(fā)數(shù)據(jù),還需要完成下面兩個步驟才能傳數(shù)據(jù):

(a)在手機端,建立一個端口為9000的 server,并打開 server 到監(jiān)聽狀態(tài)。
(b)在PC端,建立一個 socket client 端,連接到端口為8000的 server 上。
adb forward tcp:8000 tcp:9000 原理示意圖:
安卓設備通過usb接口實現(xiàn)與pc端的簡單數(shù)據(jù)通信,android,android,adb
PC端應用與手機端應用 通信建立過程:
(1)執(zhí)行 adb forward tcp:8000 tcp:9000
(2)啟動手機端應用,建立端口為9000的 server,并處于監(jiān)聽狀態(tài)(LISTENING)
(3)啟動PC端應用,連接端口為8000的 server(adb 創(chuàng)建的)之后,就可以傳輸數(shù)據(jù)了
PC端代碼====


private static boolean mRunning = true;

    public static void main(String[] args) {
        if (!setupAdbForward()) {
            System.out.println("設置端口轉發(fā)失敗");
            return;
        } else {
            System.out.println("端口轉發(fā)設置完成");
        }
        System.out.println("任意字符, 回車鍵發(fā)送");
        startClient();
    }

    private static boolean setupAdbForward() {
        try {
            // todo 將PC端8000端口的數(shù)據(jù), 轉發(fā)到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 接收手機端傳來的數(shù)據(jù)
            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();
        }
    }

    /**
     * 接收手機端傳來的數(shù)據(jù)
     */
    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端應用與手機端應用之間傳輸數(shù)據(jù)的過程:
(1)PC端應用將數(shù)據(jù)發(fā)送給端口為8000的 server(adb 創(chuàng)建的)
(2)adb 將數(shù)據(jù)轉發(fā)給手機端 adbd 進程(通過USB傳輸)
(3)adbd 進程將數(shù)據(jù)發(fā)送給端口為9000的 server(手機端應用創(chuàng)建的)傳遞是雙向的,
第(1)和第(3)步是通過socket實現(xiàn)的,所以通過 socket 的讀和寫就完成了PC端和手機端的數(shù)據(jù)傳遞。
=======andorid 端代碼=文章來源地址http://www.zghlxwxcb.cn/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("發(fā)現(xiàn)一個新的客戶端加入:"));
                    while (true) {
                        /**
                         * isClosed()、isConnected()、isInputStreamShutdown()、isOutputStreamShutdown()
                         * 這些方法無法判斷服務端是否斷開,只能判斷本地的狀態(tài)
                         */
                        // 發(fā)送心跳包,單線程中使用,判斷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());
                            /**
                             * 當接收到大數(shù)據(jù),inputStream讀取完后,由于inputStream通道是一直在的,
                             * inputStream.read(buffer)處在堵塞狀態(tài),所以并不會跳出當前循環(huán),
                             * 導致無法判斷數(shù)據(jù)是否傳輸完,所以PC端傳輸數(shù)據(jù)時需要在數(shù)據(jù)中
                             * 加入報尾,Android設備上接收到報尾,代表此次數(shù)據(jù)傳輸完畢,
                             * 也可以加上報頭,來表示數(shù)據(jù)的開始
                             *
                             */
                            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("發(fā)送:" + data);
            EventBus.getDefault().post(new MessageType("發(fā)送:" + data));
        } catch (IOException e) {
            e.printStackTrace();
            EventBus.getDefault().post(new MessageType("發(fā)送:異常"));
        }
    }
}

到了這里,關于通過usb利用adb實現(xiàn)android手機和pc機通信的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 藍牙通信 Android開發(fā)實現(xiàn)手機間通過藍牙傳輸文件

    MainActivity.java 根據(jù)以上代碼的結構和功能,我會將它們分為以下幾部分: 權限請求和檢查 requestPermissions() 方法 checkLocationPermission() 方法 onRequestPermissionsResult() 方法 初始化和設置 onCreate() 方法 onStart() 方法 onActivityResult() 方法 藍牙設備搜索和配對 discoverDevices() 方法 與列表交互

    2024年03月27日
    瀏覽(20)
  • Android(安卓) 無線ADB調試手機(WiFi 調試、藍牙調試)

    Android(安卓) 無線ADB調試手機(WiFi 調試、藍牙調試)

    1. 手機和電腦連接同一局域網(連同一個 WiFi、手機開熱點電腦連接、電腦開熱點手機連接) 2.手機打開USB調試模式 3. 查找你需要連接的Android(安卓)設備的ip (方式一)手機開熱點電腦連接(手機分享藍牙網絡給電腦連接): 1)電腦打開cmd窗口(win+R) 輸入: 2)在cmd里面輸入:

    2024年02月09日
    瀏覽(35)
  • Android Studio配置adb使用WIFI連接手機調試安卓程序

    安裝adb參考:https://www.linmeimei.top/2023/03/02/flutter-adb 手機設置 打開開發(fā)者模式(用HUAWEI舉例) 【設置】→【關于手機】→【版本號】→ 連續(xù)點擊5次即可進入開發(fā)者模式 打開USB調試 【設置】→【系統(tǒng)和更新】→【開發(fā)人員選項】→開啟【USB調試】開關→開啟【\\\"僅充電\\\"模式下允許

    2024年02月04日
    瀏覽(36)
  • 【Android】通過命令行adb install 將apk下載到手機之中

    【Android】通過命令行adb install 將apk下載到手機之中

    mac 電腦中有一個apk,想將該apk下載install到Android手機中。 首先在手機中刪除原有的apk,然后再連上數(shù)據(jù)線到電腦中(我是在Android studio的命令行)進行如下的命令行: 路徑按照實際的輸入即可

    2024年02月11日
    瀏覽(22)
  • Android Studio制作手機App:通過手機藍牙(Bluetooth)與STM32上的低功耗藍牙(HC-42)連接通信,實現(xiàn)手機端對單片機的控制。

    Android Studio制作手機App:通過手機藍牙(Bluetooth)與STM32上的低功耗藍牙(HC-42)連接通信,實現(xiàn)手機端對單片機的控制。

    背景: 本文的內容是針對單片機藍牙模塊(HC-42)開發(fā)的手機App。在這之前,我想先聲明一點,手機與手機間的藍牙連接方式”與“手機與HC間的藍牙連接方式”是不一樣的。原因就是手機搭配的是“經典藍牙”模塊,HC等藍牙屬于“低功耗藍牙”模塊。(二者的區(qū)別想了解的

    2024年02月04日
    瀏覽(28)
  • 安卓USB調試和無線調試ADB安裝apk

    widows10系統(tǒng) ## Android 設備通過usb連接開啟ADB安裝APK 1.開啟開發(fā)者模式 操作步驟:進入設置并選擇關于手機。找到版本號并點擊7次,屏幕會出現(xiàn)提示您現(xiàn)在處于開發(fā)者模式。 2.開啟USB調試 操作步驟: 返回到設置并點擊開發(fā)者選項,選擇 啟用USB調試 ,再次返回到設置并點擊安

    2024年02月05日
    瀏覽(22)
  • 在Android Studio通過adb命令強制安裝debug版本apk到手機,且允許version code降級

    在Android Studio通過adb命令強制安裝debug版本apk到手機,且允許version code降級 切換到Terminal: .appbuildintermediatesapkdebug是android studio的apk編譯生成路徑。 參數(shù): -t? ?允許安裝測試包 -d? ?運行version code 降級 -r? ?取代現(xiàn)有application -g? 授予所有權限 ? ? ? adb命令導出手機已安

    2024年02月14日
    瀏覽(30)
  • Android 13.0 通過驅動實現(xiàn)禁用usb鼠標和usb鍵盤功能

    在13.0的系統(tǒng)產品定制化開發(fā)中,在進行定制中有關于usb鍵盤和usb鼠標的需求中,產品要求禁止usb口掛載usb鼠標和usb鍵盤,所以需要要求在usb掛載類型的時候 判斷如果是usb鼠標和usb鍵盤就不讓掛載,這就需要從驅動方面入手來解決這個問題,接下來看下驅動的某些掛載usb的相

    2024年02月08日
    瀏覽(28)
  • Android 12.0 通過驅動實現(xiàn)禁用usb鼠標和usb鍵盤功能

    在12.0的系統(tǒng)產品定制化開發(fā)中,在進行定制中有關于usb鍵盤和usb鼠標的需求中,產品要求禁止usb口掛載usb鼠標和usb鍵盤,所以需要要求在usb掛載類型的時候 判斷如果是usb鼠標和usb鍵盤就不讓掛載,這就需要從驅動方面入手來解決這個問題,接下來看下驅動的某些掛載usb的相

    2024年02月08日
    瀏覽(55)
  • 華為手機USB連接成功,ADB識別失敗

    數(shù)據(jù)線斷開重連 同一 wifi adb 查連接設備 連接模式是文件傳輸 開發(fā)者模式關閉打開 USB調試關閉打開 USB調試下ADB開關之類的 手機重啟 排查數(shù)據(jù)線 排查電腦、手機(就華為不行 連接手機電腦自動彈出安裝界面 雙擊安裝,未成功 使用管理員權限安裝,未成功 去官網下載一個,

    2024年02月13日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包