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

本文共 5604 字,大约阅读时间需要 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/

    你可能感兴趣的文章
    NIO基于UDP协议的网络编程
    查看>>
    NISP一级,NISP二级报考说明,零基础入门到精通,收藏这篇就够了
    查看>>
    Nitrux 3.8 发布!性能全面提升,带来非凡体验
    查看>>
    NI笔试——大数加法
    查看>>
    NLog 自定义字段 写入 oracle
    查看>>
    NLog类库使用探索——详解配置
    查看>>
    NLP 基于kashgari和BERT实现中文命名实体识别(NER)
    查看>>
    NLP 项目:维基百科文章爬虫和分类【01】 - 语料库阅读器
    查看>>
    NLP_什么是统计语言模型_条件概率的链式法则_n元统计语言模型_马尔科夫链_数据稀疏(出现了词库中没有的词)_统计语言模型的平滑策略---人工智能工作笔记0035
    查看>>
    NLP学习笔记:使用 Python 进行NLTK
    查看>>
    NLP的神经网络训练的新模式
    查看>>
    NLP采用Bert进行简单文本情感分类
    查看>>
    NLP问答系统:使用 Deepset SQUAD 和 SQuAD v2 度量评估
    查看>>
    NLP:使用 SciKit Learn 的文本矢量化方法
    查看>>
    Nmap扫描教程之Nmap基础知识
    查看>>
    Nmap端口扫描工具Windows安装和命令大全(非常详细)零基础入门到精通,收藏这篇就够了
    查看>>
    NMAP网络扫描工具的安装与使用
    查看>>
    NMF(非负矩阵分解)
    查看>>
    nmon_x86_64_centos7工具如何使用
    查看>>
    NN&DL4.1 Deep L-layer neural network简介
    查看>>