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

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

ADB forward Android与PC进行Scokct通信

ADB 连接方式

  • 通过USB连接
  • 通过网络连接

网络连接

  • 在USB连接的基础上改为tcp:adb tcpip port
  • adb connect ip:port 例如:adb connect 127.0.0.1:5555
  • 切回usb连接:adb usb

数据转发

  • adb forward tcp:port tcp:port 例如:adb forward tcp:8000 tcp:9000
    该命令会将本机8000端口上的数据转发到手机9000端口上,前提是有连接的设备

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) {   					// TODO Auto-generated catch block					e.printStackTrace();				}			}		}	}}

Android Studio代码(服务端最简版)

AndroidManifest.xml中添加权限

package com.example.myapplication12;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() {           super.run();        try {               //设置Android端口为9000            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 中开启线程就OK了!

执行步骤

  • 先执行adb forward tcp:8000 tcp:9000
  • 运行Android 服务端
  • 运行Java客户端

结果

在这里插入图片描述

在这里插入图片描述

扩展

  • 采用adb connect 连接的一样可以得到结果
  • 模拟器只要在已经连接的都可以在Android Studio中使用

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

你可能感兴趣的文章
mysql5.7免费下载地址
查看>>
mysql5.7命令总结
查看>>
mysql5.7安装
查看>>
mysql5.7性能调优my.ini
查看>>
MySQL5.7新增Performance Schema表
查看>>
Mysql5.7深入学习 1.MySQL 5.7 中的新增功能
查看>>
Webpack 之 basic chunk graph
查看>>
Mysql5.7版本单机版my.cnf配置文件
查看>>
mysql5.7的安装和Navicat的安装
查看>>
mysql5.7示例数据库_Linux MySQL5.7多实例数据库配置
查看>>
Mysql8 数据库安装及主从配置 | Spring Cloud 2
查看>>
mysql8 配置文件配置group 问题 sql语句group不能使用报错解决 mysql8.X版本的my.cnf配置文件 my.cnf文件 能够使用的my.cnf配置文件
查看>>
MySQL8.0.29启动报错Different lower_case_table_names settings for server (‘0‘) and data dictionary (‘1‘)
查看>>
MYSQL8.0以上忘记root密码
查看>>
Mysql8.0以上重置初始密码的方法
查看>>
mysql8.0新特性-自增变量的持久化
查看>>
Mysql8.0注意url变更写法
查看>>
Mysql8.0的特性
查看>>
MySQL8修改密码报错ERROR 1819 (HY000): Your password does not satisfy the current policy requirements
查看>>
MySQL8修改密码的方法
查看>>