博客
关于我
ADB forward Android与PC进行Scokct通信
阅读量:178 次
发布时间:2019-02-28

本文共 5458 字,大约阅读时间需要 18 分钟。

ADB forward Android与PC进行Socket通信

ADB(Android Debug Bridge)是一种强大的工具,用于连接Android设备并执行多种操作,如调试应用程序或进行文件传输。本文将介绍如何通过ADB实现Android与PC之间的Socket通信。

ADB的“forward”命令允许数据通过特定的端口转发。例如,使用命令“adb forward tcp:8000 tcp:9000”可将本机8000端口的数据转发至手机9000端口。理解TCP协议的基础知识有助于更好地掌握这一过程。

Android客户端代码

在Android Studio中创建新项目,并添加必要的权限:

创建服务端线程:

import android.util.Log;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.ServerSocket;import java.net.Socket;public class ServerThread extends Thread {    private ServerSocket serverSocket;    private Socket socket;    public Socket getSocket() {        return socket;    }    @Override    public void run() {        try {            serverSocket = new ServerSocket(9000);            Log.e("tip", "*等待建立连接*");            socket = serverSocket.accept();            Log.e("tip", "*已经建立连接*");            startReader(socket);        } catch (IOException e) {            e.printStackTrace();        }    }    private void startReader(final Socket socket) {        while (true) {            String receiveMsg = "";            try {                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream(), "UTF-8"));                if ((receiveMsg = bufferedReader.readLine()) != null) {                    System.out.println("获取到客户端的信息:" + receiveMsg);                    Log.e("msg from client", receiveMsg);                    OutputStream out = socket.getOutputStream();                    receiveMsg += " from server\n";                    out.write(receiveMsg.getBytes());                    out.flush();                    Log.e("write back", receiveMsg);                } else {                    Log.e("tip", "no new msg");                }            } catch (IOException e) {                e.printStackTrace();            }        }    }}

MainActivity中启动线程:

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        new Thread(new ServerThread()).start();    }}

JAVA客户端代码

创建客户端类:

package com.example.test;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.Socket;import java.net.UnknownHostException;public class ClientApp {    static Socket socket = null;    private static boolean mRunning = false;    public static void main(String[] args) {        startClient();    }    private static void startClient() {        try {            socket = new Socket("127.0.0.1", 8000);            mRunning = true;            new Thread(new InThread(socket)).start();            new Thread(new OutThread(socket)).start();        } catch (UnknownHostException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }    }    static class InThread implements Runnable {        Socket socket = null;        public InThread(Socket s) {            socket = s;        }        @Override        public void run() {            while (mRunning) {                if (socket.isClosed()) {                    mRunning = false;                    break;                }                InputStream in = null;                try {                    in = socket.getInputStream();                } catch (IOException e1) {                    e1.printStackTrace();                }                InputStreamReader reader = new InputStreamReader(in);                try {                    char[] buf = new char[1024];                    int cnt = reader.read(buf);                    if (cnt > 0) {                        String msg = new String(buf, 0, cnt);                        System.out.println(msg);                    }                } catch (IOException e) {                    String error = e.getMessage();                    if (!error.equalsIgnoreCase("Socket closed")) {                        e.printStackTrace();                    }                }            }        }    }    static class OutThread implements Runnable {        Socket socket = null;        public OutThread(Socket s) {            socket = s;        }        @Override        public void run() {            while (mRunning) {                if (socket.isClosed()) {                    mRunning = false;                    break;                }                OutputStream out = null;                try {                    out = socket.getOutputStream();                } catch (IOException e2) {                    e2.printStackTrace();                }                try {                    System.out.println("prepare to send data to server");                    out.write("hello server\n".getBytes());                    out.flush();                } catch (IOException e) {                    e.printStackTrace();                }                try {                    Thread.sleep(2000);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        }    }}

执行步骤

  • 在命令行运行:
    adb forward tcp:8000 tcp:9000
  • 运行Android服务端应用程序。
  • 运行JAVA客户端应用程序。
  • 结果

    通过以上步骤,您应能看到Android客户端接收到来自JAVA客户端的消息,并发送反馈信息。日志输出将帮助您跟踪和调试过程中出现的问题。

    扩展

    • ADB连接方式:可以选择通过USB或网络连接,网络连接可通过“adb connect ip:port”实现。
    • 数据转发:使用“adb forward”命令可实现不同端口之间的数据转发。
    • 模拟器支持:确保模拟器已连接并设置正确的网络环境。

    通过以上方法,您可以实现Android与PC之间的Socket通信,适用于各种数据传输需求。

    转载地址:http://ybmc.baihongyu.com/

    你可能感兴趣的文章
    openSUSE 13.1 Milestone 2 发布
    查看>>
    openSUSE推出独立 GUI 包管理工具:YQPkg,简化了整个软件包管理流程
    查看>>
    OpenVSwtich(OVS)Vlan间路由实战 附实验环境
    查看>>
    Openwrt LuCI模块练习详细步骤
    查看>>
    openwrt_git_pull命令提示merger冲突时如何解决?
    查看>>
    OpenWrt包管理软件opkg的使用(极路由)
    查看>>
    OpenWrt固件编译刷机完全总结
    查看>>
    Open××× for Linux搭建之二
    查看>>
    Open×××有线网络时使用正常,无线网络时使用报错的解决方案
    查看>>
    Operation not supported on read-only collection 的解决方法 - [Windows Phone开发技巧系列1]
    查看>>
    OperationResult
    查看>>
    Operations Manager 2007 R2系列之仪表板(多)视图
    查看>>
    operator new and delete
    查看>>
    operator new 与 operator delete
    查看>>
    operator() error
    查看>>
    OPPO K3在哪里打开USB调试模式的完美方法
    查看>>
    Optional类:避免NullPointerException
    查看>>
    Optional讲解
    查看>>
    ORA-00932: inconsistent datatypes: expected - got NCLOB【ORA-00932: 数据类型不一致: 应为 -, 但却获得 NCLOB 】【解决办法】
    查看>>
    ORA-00942 表或视图不存在
    查看>>