本文共 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与PC之间的Socket通信,适用于各种数据传输需求。
转载地址:http://ybmc.baihongyu.com/