Android的网络编程总结

引言

Android网络编程知识是Android开发过程中必不可少的内容,在网络开发的过程中,我们通常会用到像Volley、OkHttp、Retrofit这些高度封装好的框架,这使得我们的开发很便利但也屏蔽了相关的技术细节。而作为想要进一步的开发者来说,我们不但要会用,有时候更要理解其实现的原理,理解了后更能促进我们更好的使用这些框架。

OSI七层网络模型

   国际标准化组织(ISO)在 1978 年提出了“开放系统互联参考模型”,即 OSI/RM 模型(Open System Interconnection/Reference Model)。他将计算机网络体系结构的通信协议划分为了七层,自下而上依次分别是:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。其中低四层完成数据传输,高三层面向用户。

在这里插入图片描述

TCP/IP四层模型

由于 OSI/RM 模型过于复杂难以实现,现实中广泛使用的是 TCP/IP 模型。TCP/IP 是一个协议集,是由 ARPA ( Advanced Research Projects Agency Network 高等研究计划署网络 ) 于 1977 到 1979 年推出的一种网络体系结构和协议规范。随着 Internet 的发展,TCP/IP 得到进一步的研究和推广,成为 Internet 上的 “通用模型”。
TCP/IP 模型在 OSI 模型的基础上进行了简化,去掉了OSI参考模型中的会话层和表示层(这两层的功能被合并到应用层实现),同时将OSI参考模型中的数据链路层和物理层合并为主机到网络层。变成了四层,从下到上分别为:网络接口层、网络层、传输层、应用层。与 OSI 体系结构对比如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191112082238756.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVp## 标题dGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZvYW05,size_16,color_FFFFFF,t_70)

IP协议

网络协议:又叫互联网协议,是用于分组交换数据网络的一种协议。
IP地址:网络中的每台计算机都必须有一个唯一的IP地址作为标识,用一组由“.”
分隔的十进制数组成
端口号:IP地址只能保证将数据送到指定的计算机,无法知道交给该主机的哪个网络程序,因此采用端口号标识计算机上正在运行的进程。
每个被发送的网络数据包都包含端口号,用于将数据帧交给具有相同端口号的应用程序处理。

TCP协议

传输控制协议,是一种面向连接的、可靠的,基于字节流的传输层通信协议。
特点:
(1)面向连接,“三次握手”;
(2)双向通信
(3)保证数据按序发送,按序到达;
(4)超时重传。
要使用 TCP 传输数据,必须先建立连接,传输完成后释放连接。分别对应常说的“三次握手”、“四次挥手”。

HTTP协议

属于应用层的面向对象的协议,适用于分布式超媒体信息系统。
主要特点:
(1)支持C/S模式;
(2)简单快速:只需传送请求方法和路径,请求方法常用的有: GET. HED. POST等;
(3)灵活:允许传输任意类型的数据对象,用Content- Type进行标记;
(4)无连接:限制每次连接只处理一个请求;
(5)无状态:对事务处理没有记忆功能。
HTTP的URL的格式:
http://host[ :port][/path]
http表示要通过HTTP协议来定位网络资源; hos t表示合法的Internet主机域名或者IP地址; port指定一个端口号,为空则使用默认端口80; pa th指定请求资源的URI。

HTTP报文响应及https请求

报文响应:由状态行、消息报文、空行、响应正文组成。
https请求:HTTPS=HTTP+SSL/TLS
HTTPS的安全基础是SSL.

Http通信方式

(1)HttpURLConnection
Android 2.3之后, HttpURL Connect ion是Android网络编程的最佳选择,它的API
简单,体积较小,压缩和缓存机制有效较少网络访问的流量
(2)HttpClient
开发团队向开发者建议:在Android 2.2版本及以下可以使用HttpClient,在2.3以
上版本则应该使用Ht tpURLConnection
Android 6. 0直接删除了HttpClient类库。

Socket通信方式

Android P的http网络请求的问题:
1.Android P要求默认使用加密连接,禁止App使用任何未加密的连接,因此需要使用
TLS (Transport Layer Security) 传输层安全协议,也就是Https;

2.Android P使用HttpUr lConnect ion进行ht tp的ge t请求会出现以下异常:
W/System.err; java .10. IOException: Cleartext HTTP traffic to **** not permitted
解决方案:
(1)推荐:使用Https连接;
(2)targetSdkVersion降到27以下版本;
(3)更改网络安全配置,此更改与网站有关,有时不能得到响应。

3.更改网络安全配置
在res新增xm1目录,创建network_ security_ config . xml,开启http请求


</network- security- config>

4.在AndroidManifest . xm1中的application标签增加以下属性
android: ne tworkSecurityConfig= "axml/network_ security_ config "

URL类

统资源定位符(URL) 是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示, 是互联网上标准资源的地址。
互联网上的每个文件都有一个唯一的URL。
URL类提供了多个构造器用于创建URL对象
URL类提供多个方法访问URL对应的资源:
URLConnection openConnection( ):返回一个URLConnect ion对象,它表示到URL
所引用的远程对象的连接。
InputStream openStream( ):打开此URL的连接, 并返回一个用于读取该URL资源的InputStream。

Android URL通信

Android HTTP URL接口的基本操作包括:
(1)创建URL以及HttpURLConnection对象
(2)连接参数设置
(3)连接到服务器
(4)向服务器写数据
(5)从服务器读取数据
HttpURLConnection是Java API的标准接口,包含在Java.net包中,继承自URLConnect ion类
URLConnection与HttpURLConnect ion都是抽象类,无法直接实例化,通过URLopenConnect ion方法获得对象.
URL url = new URL( “https ?/www. baidu. com”);
HttpURLConnection connection = (HttpURLConnection) url . openConnection( );
HttpURLConnection获取输入、输出流的方法;
InputStream getInputStream( ):获得输入流,调用此方法后才真正发生连接;
OutputStream getoutputStream( ):获得输出流;
HttpURLConnect ion的属性设置:
在这里插入图片描述HttpURLConnect ion访问HTTP资源的步骤:
(1)根据URL地址创建URL对象;
(2)使用URL对象的openConnection( )方法获取HttpURLConnection对象;
(3)设置连接的属性,包括GET/POST请求方式;
(4)输入、输出数据;
(5)关闭输入、输出流;
(6)在AndroidManifes t配置文件中设置访问INTERNET的权限。

Android常用的网络编程框架

(1)Volley :
Google官方推出的一套小而巧的异步请求库,支持httpClient (Android 6.8之后不再支
持)、HttpURLConnection。
基于网络队列,适合小数据频繁通信,请求线程池默认大小为4。
(2)0kHttp
高性能的http库, 支持同步、异步,而且支持http2. websocket协议, ap简洁易用,实现了http缓存;
Android网络访问的源码已用0kHttp代替了Ht tpURLConnection。
(3)Retrofit:
基于0kHttp封装的一套RESTful网络请求框架,底层默认采用okHttp。
目前网络框架的最好选择: RxJava + Retrofit ,OkHttp。

OkHttp

官网: http://square. github. io/okhttp∠
源码: https://github. com/ square/okhttp
配置
0kHttp支持Android 2.3及其以上版本,Java要求JDK1.7以上
添加依赖: implementation com . squareup .okhttp3: okhttp:4.2.1’
添加权限:

HTTP Get同步请求

一直等待http请求,直到返回响应,请求期间会阻塞进程,因此不能再Android的主线程执行,需要用Android的多线程方式进行处理,否则会报错。
在这里插入图片描述

Get异步请求

异步请求需要加入到一个请求队列中,并且要指定回调方法。
在这里插入图片描述

Post异步请求

通过RequestBody构建请求数据
在这里插入图片描述

post异步请求JSON数据

在这里插入图片描述

post异步下载文件

在这里插入图片描述

图片加载框架Glide

添加依赖
在这里插入图片描述
添加网络权限
在这里插入图片描述
使用:
Glide.with(this).load(“http://goo.gl/gFgYUd”).into(imageView);
加载图片的一般方法:
Glide.with(Context context).load(String url).into(ImageView imageview);

Glide集成OkHttp加载https图片

(1)导入依赖: implementation ’ com. gi thub . bumptech. glide :okhttp3 -integration:4.10.0’;
(2)创建支持https的0kHttpClient对象;
(3)创建继承AppGl ideModule类的自定义类,重写registerComponents( )方法;
(4)使用时,用GlideApp替代Glide类.
在这里插入图片描述

Glide加载htts图片

1.在AndroidManifest.xml配置自定义类
在这里插入图片描述
2.使用时用GlideApp代替Glide类
在这里插入图片描述

JSON数据解析

JSON:JavaScript Object Notation,最初是针对JavaScript而设计,能够很方便的在字符串和JavaScript对象中进行转换。后来成为一种世界通用的数据交换标准,独立于具体的编程语言。
JSON的属性值的类型
数字(整数或者浮点数);
字符串(在双引导中);
逻辑值(true或者false);
数值(在方括号中);
对象
null

创建JSON字符串

基本编程套路:
当需要创建JSON字符串时,new一个JsoNobject或者JSONArray对象,
使用它们的put系列方法向其中追加数据,根据实际情况组合装配出
JSONobject或JSONArray对象。
完成对象的装配工作之后,调用JSONObject或JSONArray的toString()
方法即可生成JSON字符串。
首先区分一下JSON字符串是单个对象还是数组,然后以这个字符串作为参
数,new一个JSONObiec t或者是JSONArray对象,Android内置的JSON
解析组件就会解析JSON字符串,自动完成JSONobjec t或者是JSONArray
对象的装配工作。
得到JSONObject或者是JSONArray对象弓|用之后,调用它的get系列方
法,就能提取出JSON字符串中特定属性的值。

第三方数据的获取方法

(1)打开聚合数据等数据提供商的网站,注册账号;
(2)搜索需要的数据API,打开开发文档;
(3)阅读API文档说明,理解API的应用;
(4)打开API的示例代码,找到JAVA或者android的示例代码;
(5)阅读理解示例代码,按照要求写入自己的项目中。


版权声明:本文为foam9原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。