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

你可能感兴趣的文章
MySQL中的DECIMAL类型:MYSQL_TYPE_DECIMAL与MYSQL_TYPE_NEWDECIMAL详解
查看>>
MySQL中的GROUP_CONCAT()函数详解与实战应用
查看>>
MySQL中的IO问题分析与优化
查看>>
MySQL中的ON DUPLICATE KEY UPDATE详解与应用
查看>>
mysql中的rbs,SharePoint RBS:即使启用了RBS,内容数据库也在不断增长
查看>>
mysql中的undo log、redo log 、binlog大致概要
查看>>
Mysql中的using
查看>>
MySQL中的关键字深入比较:UNION vs UNION ALL
查看>>
mysql中的四大运算符种类汇总20多项,用了三天三夜来整理的,还不赶快收藏
查看>>
mysql中的字段如何选择合适的数据类型呢?
查看>>
MySQL中的字符集陷阱:为何避免使用UTF-8
查看>>
mysql中的数据导入与导出
查看>>
MySQL中的时间函数
查看>>
mysql中的约束
查看>>
MySQL中的表是什么?
查看>>
mysql中穿件函数时候delimiter的用法
查看>>
Mysql中索引的分类、增删改查与存储引擎对应关系
查看>>
Mysql中索引的最左前缀原则图文剖析(全)
查看>>
MySql中给视图添加注释怎么添加_默认不支持_可以这样取巧---MySql工作笔记002
查看>>
Mysql中获取所有表名以及表名带时间字符串使用BetweenAnd筛选区间范围
查看>>