博客
关于我
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/

    你可能感兴趣的文章
    OpenCV Python围绕特定点将图像旋转X度
    查看>>
    opencv resize
    查看>>
    Opencv Sift和Surf特征实现图像无缝拼接生成全景图像
    查看>>
    opencv SVM分类Demo
    查看>>
    OpenCV VideoCapture.get()参数详解
    查看>>
    opencv videocapture读取视频cap.isOpened 输出总是false
    查看>>
    opencv waitKey() 函数理解及应用
    查看>>
    OpenCV 中的图像转换
    查看>>
    OpenCV 人脸识别 C++实例代码
    查看>>
    OpenCV 在 Linux 上的 python 与 anaconda 无法正常工作.收到未实现 cv2.imshow() 的错误
    查看>>
    Opencv 完美配置攻略 2014 (Win8.1 + Opencv 2.4.8 + VS 2013)上
    查看>>
    opencv 模板匹配, 已解决模板过大程序不工作的bug
    查看>>
    OpenCV 错误:(-215)size.width>0 &&函数imshow中的size.height>0
    查看>>
    opencv&Python——多种边缘检测
    查看>>
    opencv&python——高通滤波器和低通滤波器
    查看>>
    OpenCV+Python识别车牌和字符分割的实现
    查看>>
    OpenCV-Python接口、cv和cv2的性能比较
    查看>>
    OpenCV/Python/dlib眨眼检测
    查看>>
    opencv1-加载、修改、保存图像
    查看>>
    opencv10-形态学操作
    查看>>