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

你可能感兴趣的文章
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>
MySQL 添加索引,删除索引及其用法
查看>>
mysql 状态检查,备份,修复
查看>>
MySQL 用 limit 为什么会影响性能?
查看>>
MySQL 用 limit 为什么会影响性能?有什么优化方案?
查看>>
MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
查看>>
mysql 用户管理和权限设置
查看>>
MySQL 的 varchar 水真的太深了!
查看>>
mysql 的GROUP_CONCAT函数的使用(group_by 如何显示分组之前的数据)
查看>>
MySQL 的instr函数
查看>>
MySQL 的mysql_secure_installation安全脚本执行过程介绍
查看>>