Android 使用Socket完成进程间通信

看一些Android应用,特别是涉及到底层的功能性的应用,比如游戏加速,修改内存,挂机脚本神马的,发现里面的通信机制无一例外的都是使用的socket,基本上已经成为这类应用的一种标配了。

因为这类应用有以下的几个共同点:

1 需要android 手机的root权限,毕竟要修改一些比较底层的东西,没有root权限有时候木有办法修改啊

2 有自己的so,同时比较重要的或者比较吃力的活都编译成一个可执行的elf文件,然后让apk应用给这个elf文件给启动起来。关于这个elf文件放置的位置也有几种选择。

情况1:直接放在应用包下面的lib目录下,然后给这个可执行文件赋予一个可执行的权限。

情况2:放在assets文件夹下面,在程序启动的时候拷贝到files文件夹下面,赋予可执行的权限后,然后执行

情况3:也是放在assets文件夹下面,只不过安全性高一点,一般会做一个简单的异或或者移位加密,然后修改以下扩展名,拷贝过去的时候减密一下。再执行,有时候执行了以后会把真正的elf文件再给删除了。

3 可执行的so文件和java应用程序之间的通信使用socket,因为毕竟可执行的so才是真正干活的主力,而java应用程序要给so发送指令,而so也要给java应用程序反馈一些有用的数据供上层显示给用户。关于socket通信的方式也有下面的几种情况

情况1: 可执行的so作为server端,java应用程序给其发送指令的时候主动去链接可执行so,发送数据,有时候so也会返回一些数据,一般这种情况so就直接把活给干了,比如游戏加减速。

情况2:可执行的so文件作为客户端,同时使用长链接的方式,这种情况就需要java应用程序作为server端了,这里的稍微巧妙一点的是不采用固定的socket的端口号,而是java应用程序在创建socket的时候使用系统自动分配的端口号。不过需要通过java应用程序在启动可执行so的时候将端口号传递给so文件。

原理基本上就这么多了,下面的是一个例子,这个例子涉及到的编程技术主要是java应用程序自己创建socket的客户端和服务器端,然后进行通信,同时也启动了一个so的可执行文件,通过进程之间的数据流,向可执行的so发送数据,可执行的so将接收到的数据通过log给打印出来。

进入demo例子,

点击启动 socket server

这个时候log会打印出来

11-04 15:56:28.341:V/cheatecore-server(5774): server port = 44034

这样的数据,

由于serverSocket = new ServerSocket(m_port);

其中 m_port 为0,所以端口号是系统临时分配的。

然后socketserver 就开始等待有客户端的socket 来链接

m_socket = serverSocket.accept();

其中 accept 是阻塞函数,会将这个线程阻塞掉的。这个时候

通过 adb shell 进入android手机,使用 netstat –an | busybox grep 44034 查看,发现是这样的现象

显然这个端口是 listen 状态

然后点击设置客户端socket端口号和启动客户端socket

11-04 16:03:11.067: V/cheatecore(5774): 获取服务器端的端口号:44034

11-04 16:03:15.575:V/cheatecore-client(5774): client socket begin

11-04 16:03:15.575:V/cheatecore-server(5774): a client socket come here!!!

这个时候出现了a client socket comehere!!!

这条log再次执行刚才的

netstat –an | busybox grep 44034

发现已经变成如下的结果了

已经有随机分配的客户端端口号跟server端建立了链接了

然后再点击获取数据流

reader = new BufferedReader(inputreader);

serveroutwriter = new PrintWriter(newBufferedWriter(new OutputStreamWriter(sk.getOutputStream())),true);

主要获取socket的输入流和输出流,也就是客户端和服务端的tcp链接已经建立起来了,剩下的就是通过流来接收和发送数据了

接着点击

启动服务器socket 接收数据线程

String sReader = reader.readLine();

这条语句就在等着客户端的socket数据过来呢,其中readLine是一个阻塞函数,熟悉c语言的同学,其实这个就是socket 中的 recv函数,阻塞调用了。

因为tcp是全双工的,并且当前状态是长链接,所以服务端可以向客户端发送数据,客户端也可以向服务端发送数据,下一个按钮

服务器端socket发送数据

11-04 16:11:19.810: V/cheatecore-client(5774):客户端接收到服务端的数据:server data

11-04 16:11:19.810:V/cheatecore-server(5774): 服务端接收到客户端的数据:clientdata

这个时候出现的log,客户端在收到服务器的数据以后,也会向服务器端再返回数据,这样就完成了一次交互,但是其实这个时候socket并没有断掉,因为是长链接,可以进行多次发送

最后结束socket

关闭了socket,这个时候再用 netstat –an | busybox grep 44034

这个指令来进行查询,发现如下图:

刚才建立的socket已经释放了,再过一会查询wait超时后也会将端口释放掉了

测试向启动的进程发送数据

11-04 16:15:11.278: E/cheatecore(6163):input target main function!!!!

11-04 16:15:11.278: E/cheatecore(6163):scanf input content is 44034

主要过程是首先启动

/data/data/com.example.sockettest/files/target

这个程序

testprocee =Runtime.getRuntime().exec(cmd);

PrintWriterpoutwriter = newPrintWriter(newBufferedWriter(newOutputStreamWriter(testprocee.getOutputStream())),true);

poutwriter.println(test);

然后发送数据,完成了这次进程间数据的交互,其实这也是进程之间通信的一种方式,和利用socket完成进程之间的通信并列的。

Android 使用Socket完成进程间通信,布布扣,bubuko.com

时间: 2024-11-18 19:32:25

Android 使用Socket完成进程间通信的相关文章

Android开发之IPC进程间通信-AIDL介绍及实例解析

一.IPC进程间通信 IPC是进程间通信方法的统称,Linux IPC包括以下方法,Android的进程间通信主要采用是哪些方法呢? 1. 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信:   2. 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身:linux除了支持Unix早期

android使用socket进行本地PC通信

一.编写思路 手机端为客户端,PC为服务端,手机访问PC通信,需建立一个虚拟的通信链路,客户端通过socket发送请求到服务端,服务端通过serversocket监听来自客户端的socket请求,并生成一个socket.这样就建立了一条虚拟通信网络,然后再通过相关方法进行通信.项目需在服务端建立一个java程序,客户端建立一个android程序. 二.代码编写 (一) PC端的代码编写--java程序 (1)相关方法 Socket accept() :如果接收到一个来自客户端的socket的连接

【android】Socket简单用法

原文地址:http://www.cnblogs.com/harrisonpc/archive/2011/03/31/2001565.html Socket通常也称做”套接字“,用于描述IP地址和端口,废话不多说,它就是网络通信过程中端点的抽象表示.值得一提的是,Java在包java.net中提供了两个类Socket和ServerSocket,分别用来表示双向连接的客户端和服务端.这是两个封装得非常好的类,使用起来很方便! 下面将首先创建一个SocketServer的类作为服务端如下,该服务端实现

Android 通过SOCKET下载文件的方法

本文实例讲述了Android通过SOCKET下载文件的方法.分享给大家供大家参考,具体如下: 服务端代码 import java.io.BufferedInputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.

Android连接socket服务器上传下载多个文件

android连接socket服务器上传下载多个文件1.socket服务端SocketServer.java public class SocketServer { int port = 8888;// 端口号,必须与客户端一致 // 选择进行传输的文件(测试) String path = "C:\\Temp"; String filePath = "E:\\img.png"; Socket client; public static void main(Strin

Appium 连手机失败Error: Android bootstrap socket crashed: Error: getaddrinfo ENOTFOUND localhost undefined:4724

问题:Appium执行,连接手机报下面的错误 Error: Android bootstrap socket crashed: Error: getaddrinfo ENOTFOUND localhost undefined:4724 at Socket.<anonymous> (lib/bootstrap.js:87:21) at emitOne (events.js:90:13) at Socket.emit (events.js:182:7) at connectErrorNT (net

基于android的Socket通信

一.Socket通信简介 Android与服务器的通信方式主要有两种,一是Http通信,一是Socket通信.两者的最大差异在于,http连接使用的是“请求—响应方式”,即在请求时建立连接通道,当客户端向服务器发送请求后,服务器端才能向客户端返回数据.而Socket通信则是在双方建立起连接后就可以直接进行数据的传输,在连接时可实现信息的主动推送,而不需要每次由客户端想服务器发送请求. 那么,什么是socket?Socket又称套接字,在程序内部提供了与外界通信的端口,即端口通信.通过建立sock

Android中socket初体验

最近要做一个Android的项目,用到socket和服务器之间交互,研究了一个小demo.主要遇到了以下几个问题: 1.客户端创建socket对象时一直失败NetworkOnMainThreadException,查了一下,原因是4.0之后在主线程中执行http请求会报这个错.解决办法是将代码放到了一个新线程中,问题就解决了. 2.服务器接收到客户端信息后反馈给客户端信息,将该信息表示在客户端UI上时报“android.view.ViewRoot$CalledFromWrongThreadExc

Android local socket学习总结

转载请注明出处: http://blog.csdn.net/xiexh0921/article/details/7513628 ############################################## 目的:实现本地 C程序与apk的socket通信. 原理:没有涉及到网络通信,所以使用Android封装的local socket要更简单 参考:系统源码RIL模块 整理:Andy.xie ############################################