
android socket通信协议的封装和解析,其实是和java一样的,都是通过>import javaioBufferedReader;
import javaioBufferedWriter;
import javaioIOException;
import javaioInputStreamReader;
import javaioOutputStreamWriter;
import javaioPrintWriter;
import javanetServerSocket;
import javanetSocket;
import javautilArrayList;
import javautilList;
import javautilconcurrentExecutorService;
import javautilconcurrentExecutors;
public class Main {
private static final int PORT = 9999;
private List<Socket> mList = new ArrayList<Socket>();
private ServerSocket server = null;
private ExecutorService mExecutorService = null; //thread pool
public static void main(String[] args) {
new Main();
}
public Main() {
try {
server = new ServerSocket(PORT);
mExecutorService = ExecutorsnewCachedThreadPool(); //create a thread pool
Systemoutprintln("服务器已启动");
Socket client = null;
while(true) {
client = serveraccept();
//把客户端放入客户端集合中
mListadd(client);
mExecutorServiceexecute(new Service(client)); //start a new thread to handle the connection
}
}catch (Exception e) {
eprintStackTrace();
}
}
class Service implements Runnable {
private Socket socket;
private BufferedReader in = null;
private String msg = "";
public Service(Socket socket) {
thissocket = socket;
try {
in = new BufferedReader(new InputStreamReader(socketgetInputStream()));
//客户端只要一连到服务器,便向客户端发送下面的信息。
msg = "服务器地址:" +thissocketgetInetAddress() + "come toal:"
+mListsize()+"(服务器发送)";
thissendmsg();
} catch (IOException e) {
eprintStackTrace();
}
}
@Override
public void run() {
try {
while(true) {
if((msg = inreadLine())!= null) {
//当客户端发送的信息为:exit时,关闭连接
if(msgequals("exit")) {
Systemoutprintln("ssssssss");
mListremove(socket);
inclose();
msg = "user:" + socketgetInetAddress()
+ "exit total:" + mListsize();
socketclose();
thissendmsg();
break;
//接收客户端发过来的信息msg,然后发送给客户端。
} else {
msg = socketgetInetAddress() + ":" + msg+"(服务器发送)";
thissendmsg();
}
}
}
} catch (Exception e) {
eprintStackTrace();
}
}
/
循环遍历客户端集合,给每个客户端都发送信息。
/
public void sendmsg() {
Systemoutprintln(msg);
int num =mListsize();
for (int index = 0; index < num; index ++) {
Socket mSocket = mListget(index);
PrintWriter pout = null;
try {
pout = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(mSocketgetOutputStream())),true);
poutprintln(msg);
}catch (IOException e) {
eprintStackTrace();
}
}
}
}
}
>Binder是Android中一种跨进程通信方式,还可以理解为一种虚拟的物理设备,它的设备驱动是/dev/binder。
从Framework角度来说,Binder又是ServiceManager连接各种Manager和相应ManagerService的桥梁,从应用层来说,它是客户端和服务端进行通信的媒介,绑定服务的时候服务端会返回一个包含服务端业务调用的Binder对象,通过这个Binder对象,客户端就可以获取服务端提供的服务或者数据。
在 build/generated/aidl_source_output_dir/debug/out 目录下会自动生成一个IBookManagerjava文件,它继承了IInterface接口。
IBookManagerjava里边声明了两个方法getBookList和addBook
同时声明了两个整型的id,标识两个方法,用于在transact过程中判断客户端发送请求的到底是哪个方法。
声明了一个内部类Stub,是一个Binder派生类,客户端和服务端都位于同一个进程时,方法不会走跨进程transact过程,而当连着处于不同的进程,就会走transact过程,这个邮它的内部类Proxy来完成。
Binder的唯一标识,一般用单签Binder的类名标识。
用户将服务端的Binder对象转换陈客户端所需的AIDL对象,这种转换是区分进程的,同一进程返回的是服务端的Stub对象本身,否则是系统封装后的Stubproxy对象。
返回当前的Binder对象。
这个方法运行于服务端的Binder线程池中,当客户端发起跨进程请求时,远程请求会通过系统底层封装后交由次方法来处理。参数code确定客户端的请求目标方法,参数data存放数据,请求完成后,reply中写入返回值,onTransact如果返回false,客户端会请求失败,可以用这个特性来做权限验证。
这个方法运行在客户端,当客户端远程调用次方法时。
Binder运行于服务端,可能由于某种原因异常终止,这个时候我们到服务端的Binder连接已经断裂。会导致调用远程失败,客户端功能受到影响。
Binder中提供linkToDeath和unlinkToDeath方法,通过linkToDeath给Binder设置死亡代理,当Binder死亡时,我们会收到用纸,就可以重新发起连接请求,从而恢复连接。
Binder连接池的主要作用是将每个业务模块请求统一发到远程Service中去执行,从而避免重复创建Service的过程。
ISecurityCenteraidl
IComputer aidl
SecurityCenterImpljava
ComputerImpljava
首先去绑定服务,绑定服务后,客户端可以通过它的queryBinder方法区获取各自对应的Binder。
通过CountDownLatch将bindService这一异步的 *** 作转换成同步 *** 作。Binder的调用过程可能是耗时的,因此不建议在主线程执行。
BinderPool可以方便日常AIDL的开发,如果需要添加新的AIDL,只需要实现自己的AIDL之后,把BinderPoolImpl中的queeyBinder方法进行修改,添加一个新的binderCode并返回对应的Binder对象即可。大 学学习网络基础的时候老师讲过,网络由下往上分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。通过初步的了解,我知道IP协议对应于网 络层,TCP协议对应于传输层,而>
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)