文章目录
Android
1 AIDL
全称:Android Interface definition language
作用:用于不同进程间的通信接口(数据共享数据相互操作)。
1.1 远程服务
远程启动服务
在被操作的服务中的AndroidManifest添加service过滤器
其他(操作的)应用中调用
远程绑定服务
在另一个程序中检测到所操作服务的进度——AIDL(两个进程中数据共享,bound在同一个进程中数据共享)
1.2 AIDL使用
1.创建 aidl 文件
2.自动生成的 java 文件
3.使用 aidl
右键包名新建AIDL,就会自动创建一个aidl 文件夹,下面有与项目同包名。
查看该项目的目录找到自动生成的文件:build\generated\source\aidl\debug\包*.java
![](https://i-blog.csdnimg.cn/blog_migrate/9f933f5371f6ff3b23e85fd330f34c72.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4c6b2d1fa13b6e51dc827f1713f71a2a.png)
1.3 电话拦截
1.ITelephony.aidl
2.NeighboringCellInfo.aidl
2 Socket
Socket 两种通信模型:UDP、TCP
http与socket通信的区别:http应用层 / socket传输层
2.0 网络操作基础知识
2.0.1 IP地址、端口号
-
IP地址用于在网络中唯一标识一台机器(通信实体),是一个32位整数,通常用4个0-255的十进制数标识;
-
端口号用于唯一标识通信实体上进行网络通讯的程序,同一台机器上不能有两个程序占用同一个端口的情况;端口号是一个16位整数,共有3类;
1.公认端口:0-1023,它们紧密绑定一些特定的服务(比如TCP/IP通信协议程序的端口);
2.注册端口:1024-49151,它们松散绑定一些特定服务,其余可以随意使用,应用程序用的最多端口号来自于这个范围;
3.动态/私有端口:49152-65535 ,这些端口一般是应用程序运行时临时地、动态地占用,可以说是一种竞争资源吧,应用程序本身不会和这些端口绑定,一般会将其作为资源利用; -
真正参与网络通信的对象是计算机上的程序(网络通信程序), IP地址是它的街道门牌,而端口是它的房间号;
2.0.2 阻塞与非阻塞IO
IO的阻塞、非阻塞主要表现在一个I0操作过程中,如果有些操作很慢, 比如读操作时需要准备数据,那么当前I0进程是否等待操作完成,还是得知暂时不能操作后先去做别的事情?一直等待下去,什么事也不做直到完成,这就是阻塞。抽空做些别的事情,这是非阻塞。
非阻塞IO会在发出IO请求后立即得到回应,即使数据包没有准备好,也会返回一个错误标识,使得操作进程不会阻塞在那里。操作进程会通过多次请求的方式直到数据准备好,返回成功的标识。
想象一下下面两种场景:
A小明和小刚两个人都很耿直内向,一天小明来找小刚借书: "小刚啊,你那本XXX借我看看”。于是小刚就去找书 ,小明就等着, 找了半天找到了,把书给了小明。
B小明和小刚两个人都很活泼外向,一天小明来找小刚借书:"嘿小刚,你那本XXX借我看看”。小刚说: “我得找一会” ,小明就去打球去了。过会又来,这次书找到了,把书给了小明。
结论:A是阻塞的,B是非阻塞的。
从CPU角度可以看出非阻塞明显提高了CPU的利用率进程不会一直在那等待。但是同样也带来了线程切换的增加。增加的CPU使用时间能不能补偿系统的切换成本需要好好评估。
2.0.3 同步与异步IO
判断同步和异步的标准在于:一个I0操作直到完成,是否导致程序进程的阻塞。如果阻塞就是同步的,没有阻塞就是异步的。这里的IO操作指的是真实的IO操作,也就是数据从内核拷贝到系统进程(读)的过程。继续前面借书的例子,异步借书是这样的:
C小明很懒,一天小明来找小刚借书:“嘿小刚,你那本XXX借我看看”。小刚说: “我得找一会”, 小明就出去打球了并且让小刚如果找到了就把书拿给他。小刚是个负责任的人,找到了书送到了小明手上。
A和B的借书方式都是同步的,有人要问了B不是非阻塞嘛,怎么还是同步?前面说了IO操作的2个步骤:准备数据和把数据从内核中拷贝到程序进程。映射到这个例子,书即是准备的数据,小刚是内核,小明是程序进程,小刚把书给小明这是拷贝数据。在B方式中,小刚找书这段时间小明的确是没闲着,该干嘛干嘛,但是小刚找到书把书给小明的这个过程也就是拷贝数据这个步骤小明还是得乖乖的回来候着小刚把书递手上。所以这里就阻塞了,根据上面的定义,所以是同步。
在涉及到I0处理时通常都会遇到一个是同步还是异步的处理方式的选择问题。
同步能够保证程序的可靠性,而异步可以提升程序的性能。小明自己去取书不管等着 不等着,迟早拿到书,指望小刚找到了送来,万一小刚忘了或者有急事忙别的了,那书就没了。
2.1 UDP
![](https://i-blog.csdnimg.cn/blog_migrate/027ec9a78c023e66671bd06966f6db89.png)
API介绍
InetAddress
DatagramSocket(receive,send)
DatagramPacket
实战:Client与Server通信
最后UdpServer().start();先在Client发送数据。
移植客户端
布局文件:Button,EditText,ScrollView里面有个TextView
MainActivity,要加入网络的权限。
appendMsgToContent后面添加一句mEtMsg.setText("");
最后重写OnDestroy方法,调用mUDPcLIENTbIZ.onDestroy();
2.2 TCP
![](https://i-blog.csdnimg.cn/blog_migrate/39d326fa6573a82fdceadfd6543b9be2.png)
API介绍
ServerSocket
Socket
实战:简易版本聊天室;涉及:消息队列、多线程处理。
服务端:
观察者模式参考:https://blog.csdn.net/weixin_45044097/article/details/107283493
main方法启动:new TcpServer().start();
客户端:
main方法启动:new TcpClient().start();
移植客户端
2.3 Https实战
API介绍
HttpsURLConnection
X509Certificate
KeyStore
SSLSocketFactory
![](https://i-blog.csdnimg.cn/blog_migrate/03ebd8c1ed9665c1fe946bfc7cb1a669.png)
//
SSLContext sslContext = SSLContext.getInstance("TLS");
Trus tManager[] trustManagers = {new MyX509TrustManager()};
sslContext.init(null,trustmanagers,new SecureRandom());
conn.setSSLSocketFactory( sslContext.getSocketFactory());
新建类MyX509TrustManager实现类X509TrustManager,重写方法checkClientTrusted(), checkServerTrusted(), getAcceptedIssures(),无代码,请求所有,没有安全性。
后续会乱码,byte数组修改为char数组:
布局文件
实现安全通信的话,就在刚刚的MyX509TrustManager中实现方法:
在HttpUtils中添加方法getCert
修改doGet方法,证书校验,域名校验: