PC端的XX助手和手机App的通讯原理:
# 把PC端8000端口的数据, 转发到Android端的9000端口上. adb forward tcp:8000 tcp:9000
执行命令后, PC端的8000端口会被 adb
监听, 这个时候我们只需要往8000端口写数据, 这个数据就会发送到手机端的9000端口上.
PC端程序
把输入内容发送给8000端口
public class PCClient { public static void main(String[] args) throws IOException { System.out.println("任意字符, 回车键发送Toast"); Scanner scanner = new Scanner(System.in); while (true) { String msg = scanner.next(); sendToast(msg); } } public static void sendToast(String msg) throws IOException { Socket socket = new Socket("127.0.0.1", 8000); DataInputStream dis = new DataInputStream(socket.getInputStream()); DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); dos.writeUTF(msg); socket.close(); } }
Android端程序
监听9000端口, 把收到的数据, Toast在屏幕上
public class MainActivity extends AppCompatActivity { private static final String TAG = "ServerThread"; ServerThread serverThread; Handler handler = new Handler() { @Override public void handleMessage(Message msg) { Toast.makeText(getApplicationContext(), msg.getData().getString("MSG", "Toast"), Toast.LENGTH_SHORT).show(); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); serverThread = new ServerThread(); serverThread.start(); } @Override protected void onDestroy() { super.onDestroy(); serverThread.setIsLoop(false); } class ServerThread extends Thread { boolean isLoop = true; public void setIsLoop(boolean isLoop) { this.isLoop = isLoop; } @Override public void run() { Log.d(TAG, "running"); ServerSocket serverSocket = null; try { serverSocket = new ServerSocket(9000); while (isLoop) { Socket socket = serverSocket.accept(); Log.d(TAG, "accept"); DataInputStream inputStream = new DataInputStream(socket.getInputStream()); DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream()); String msg = inputStream.readUTF(); Message message = Message.obtain(); Bundle bundle = new Bundle(); bundle.putString("MSG", msg); message.setData(bundle); handler.sendMessage(message); socket.close(); } } catch (Exception e) { e.printStackTrace(); } finally { Log.d(TAG, "destory"); if (serverSocket != null) { try { serverSocket.close(); } catch (Exception e) { e.printStackTrace(); } } } } } }
运行效果
源码
实际开发中的问题
- Android端的程序 有可能被干掉
- adb forward 有可能会被干掉
由于连接不稳定性,判断真正连接成功的方法,只有轮询收发握手数据包:
C发送一个数据包,等待S回复;
C如果收到了S的回复包,说明连通。
如果接收超时,则认为没有连通.
在没有连通的情况下,需要重新建立Socket,并Connect(),然后再尝试握手。
作者:口袋FPV 链接:http://www.jianshu.com/p/fee5b31774be 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
相关推荐
交叉编译arm Linux环境下的android-tools-adb工具,本资源包含了完整的Ubuntu1604平台下的android-tools-adb源码包,openssl源码包,zlib源码包。以及完整的编译说明和指导,按照说明操作,可以轻松生成arm平台下可...
android-ADB工具-windows.zip
Android-adb.zip
android-adb 是 Android SDK 中的 adb 工具的一个 Ruby 语言封装版本。 Android Debug Bridge( ADB ) 是 Android SDK 中的一个工具, 使用 ADB 的时候需先将 Android SDK 安装到目录路径中。使用 ADB 可以直接操作...
详尽的android-adb环境配置总结,eclipse配置,移动开发。
使用adb实现PC机与终端的通信。PC端采用java编写,采用端口映射、socket编程建立通信连接。
Android-awesome-adb.zip,ADB使用完成/ADB,安卓系统是谷歌在2008年设计和制造的。操作系统主要写在爪哇,C和C 的核心组件。它是在linux内核之上构建的,具有安全性优势。
python-adb 包括一个纯 Python 实现的 ADB 和 Fastboot 协议,使用 libusb1 进行 USB 沟通。python-adb 完全替代和重构了 Android 项目的 ADB 和 fastboot 代码...
涵盖了adb,基于usb的socket通信,pc与android设备的通信. 想研究adb传输中文,adb连接多台手机等同学可以研究甚至修改.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
android2.2-adb源码,包含adb协议的说明
a.PC客户端与Android服务端的Socket同步通信(USB) b.操作步骤如下: ----------------------------------------------------------- 1.请将测试数据文件夹中的ucliulanqi.apk copy到c:\下进行测试 2. 将android...
axis2-adb-1.4.1.jar axis2-adb-1.4.1.jar
ADB配置(安卓调试器)Android SDK platform-tool
客户需要开机后自动启动wifi-adb服务,所以就在程序里加了一下,开机后会自动打开wifi-adb连接服务,前提是的设备wifi是ok的,就可以通过wifi 来连接adb了。
fb-adb 是一个用于 Android 设备上的界面工具,用于与 Android 系统的交互。它与 Android adb 之间存在很多的相同点,但是 fb-adb 能够更好的支持远程;且 Bug 更少。 fb-adb 与 Android adb 之间的差异如下: ...
oculus go usb driver 1.0
java调用webservice接口所需jar包, axis2-adb-1.5.4.jar
此下载包含在基于Android的Oculus设备上使用ADB所需的驱动程序。版本2增加了对MTP模式连接的支持。 要安装驱动程序,请解压缩软件包并右键单击>安装android_winusb.inf文件在你的电脑上的文件。
android adb- android adb- android adb- android adb- android adb