网络的基本概念
网络的基本知识
IP地址和端口号
IP地址:网络中的每台计算机都必须有一个唯一的IP地址作为标识,用一组由“. ”分隔的十进制数组成
端口号:IP地址只能保证将数据送到指定的计算机,但无法知道交给该主机的哪个网络程序,因此采用端口号标识计算机上正在运行的进程
每个被发送的网络数据都包含端口号,用于将数据帧交给具有相同端口号的应用程序处理
JAVA的网络编程由java.net包中的类进行处理
InetAddress类:描述IP地址
网络协议
HTTP协议
属于应用层的面向对象的协议,适用于分布式超媒体信息系统
主要特点:
支持C/S模式
简单快速:只需传送请求方法和路径,请求方法常用的有:GET、HEAD、POST等
灵活:允许传输任意类型的数据对象,用Content-Type进行标记
无连接:限制每次连接只处理一个请求
对事务处理没有记忆功能
Http的几种请求方式
Get:请求获取Request-URI所标识的资源
POST:在Request-URI所标识的资源后附加新的数据
HEAD 请求获取由Request-URI所标识的资源的响应信息报头
PUT:请求服务器存储一个资源,并用Request-URI作为其标识
DELETE:请求服务器删除Request-URI所标识的资源
TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT:保留将来使用
OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项
HTTP的URL格式:
http://host[:port][/path]
http表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用默认端口80;path指定请求资源的URI
HTTP请求报文
由请求行、请求报头、空行和请求数据组成
HTTP响应报文
由状态行、消息报头、空行、响应正文组成
常见的状态码
200 OK:客户端请求成功
400 Bad Request:客户端请求有语法错误,不能被服务器所理解
401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用
403 Forbidden:服务器收到请求,但是拒绝提供服务
404 Not Found:服务器无法根据客户端的请求找到资源
500 Internal Server Error:服务器发生不可预期的错误
503 Server Unavailable:服务器当前不能处理客户端的请求,以断时间后可能恢复正常
HTTPS
HTTPS原理
HTTPS(Hyper Text Transfer Protocol Secure),是一种基于SSL/TLS的HTTP,所有的HTTP数据都是在SSL/TLS协议封装之上进行传输的。HTTPS协议是在HTTP协议的基础上,添加了SSL/TLS握手以及数据加密传输,也属于应用层协议。所以,研究HTTPS协议原理,最终其实就是研究SSL/TLS协议。
SSL/TLS协议作用
不使用SSL/TLS的HTTP通信,就是不加密的通信,所有的信息明文传播,带来了三大风险:
窃听风险:第三方可以获知通信内容。
篡改风险:第三方可以修改通知内容。
冒充风险:第三方可以冒充他人身份参与通信。
SSL/TLS协议是为了解决这三大风险而设计的,希望达到:
所有信息都是加密传输,第三方无法窃听。
具有校验机制,一旦被篡改,通信双方都会立刻发现。
配备身份证书,防止身份被冒充。
基本的运行过程
SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。但是这里需要了解两个问题的解决方案。
如何保证公钥不被篡改?
解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。
公钥加密计算量太大,如何减少耗用的时间?
解决方法:每一次对话(session),客户端和服务器端都生成一个“对话密钥”(session key),用它来加密信息。由于“对话密钥”是对称加密,所以运算速度非常快,而服务器公钥只用于加密“对话密钥”本身,这样就减少了加密运算的消耗时间。
因此,SSL/TLS协议的基本过程是这样的:
客户端向服务器端索要并验证公钥。
双方协商生成“对话密钥”。
双方采用“对话密钥”进行加密通信。
上面过程的前两布,又称为“握手阶段”。
SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。但是这里需要了解两个问题的解决方案。
如何保证公钥不被篡改?
解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。
公钥加密计算量太大,如何减少耗用的时间?
解决方法:每一次对话(session),客户端和服务器端都生成一个“对话密钥”(session key),用它来加密信息。由于“对话密钥”是对称加密,所以运算速度非常快,而服务器公钥只用于加密“对话密钥”本身,这样就减少了加密运算的消耗时间。
因此,SSL/TLS协议的基本过程是这样的:
客户端向服务器端索要并验证公钥。
双方协商生成“对话密钥”。
双方采用“对话密钥”进行加密通信。
上面过程的前两布,又称为“握手阶段”。
HTTPS请求过程
HTTP和HTTPS区别
Android网络编程
Http通信方式
HttpURLConnection:Android 2.3之后,HttpURLConnection是Android网络编程的最佳选择,它的API简单,体积较小,压缩和缓存机制有效较少网络访问的流量
HttpClient
Android SDK中包含了HttpClient,在Android6.0版本直接删除了HttpClient类库,如果仍想使用则解决方法是:
如果使用的是eclipse则在libs中加入org.apache.http.legacy.jar这个jar包在:**sdk\platforms\android-23\optional目录中(需要下载android6.0的SDK)
URL类
统一资源定位符,是对可以从互联网得到的资源的位置和访问方法的一种简洁的表示,是互联网标准资源的地址。
互联网上的每个文件都有一个唯一的URL
URL类提供了多个构造器用于创建URL对应的资源:1.Connection open Connection():返回一个URLConnection对象,它表示到URL所引用的远程对象的连接2.InputStream openStream():打开此URL的连接,并返回一个用于读取该URL资源的InputStream
URL通信
URL接口的基本操作包括:
创建URL以及HttpURLConnection对象
连接参数设置
连接到服务器
向服务器写数据
从服务器读取数据
HttpURLConnection是Java API的标准接口,包含在Java.net包中,继承自URLConnection类
HttpURLConnection与URLConnection都是抽象类,无法直接实例化,通过URL的openConnection方法获得对象INTERENT的权限
HttpURLConnection使用的注意事项
使用setConnectTimeout()方法设置连接超时,当网络不好时,Android系统会在超过设置时间后收回资源,中断操作。
通过getResponseCode()对响应码进行判断,如果返回的响应码为200,则表示连接成功
在对大文件操作时,要将文件写到SDCard上,不要直接写到手机内存上操作大文件时,要一边从网络上读取,一边往SDCard上写入,减少手机内存的使用
对文件流操作完毕后要及时关闭
Android4. 0后所有网络通信的操作都不能在主线程进行,需要使用独立的线程完成
常用的免费API接口提供者
天行数据:www.tianapi.com/注册获取API Key聚合数据:www.juhe.cn/每个接口有appKey
易源数据:www.showapi.com/注册申请获取appKey
MobTech:www.mob.com/
Android常用的网络编程框架
Volley
GoogLe官方推出的一套小而巧的异步请求库,支持HttpClient (Android 6.0之后不再支持)、HttpURLConnection
基于网络队列,适合小数据频繁通信, 请求线程池默认大小为4OkHttp
高性能的http库,支持同步、步,而且支持http2、websocket协议, api简洁易用,实现了http缓存
Android网络访问的源码已用0kHtt p代替了Ht tpURLConnect ion
Retrofit
基于0kHttp封装的一套RESTful网络请求框架,底层默认采用0kHttp
目前网络框架的最好选择: RxJava + Retrofit + 0kHttp
OkHttp开发基本思路
0kHttp的每次网络请求是-个Request,提供Request必要的参数url、header等,基于Request构造出一个Call对象,再调用它的execute( )方法,就能取得Web Server回复的数据
如果同步调用,要在独立的线程中执行,使用异步调用,则采胞调的方式执行,在内部封装了一个请求队列。
0kHttp依赖另一个组件okio完成高性能的I/0操作
基本用法
新建一个0kHttpClient对象
通过Request. Builder对象新建一个Reques t对象
通过Reques t对象构造Call对象,调用enqueue()以异步的方式将call加入调度队列,等待request执行完成
通过Call对象的Callback对象返回执行结果
Get同步请求(一般不适用)
当HTTP响应码位于200到300之间时,认为操作是成功的
response.body()返回一个ResponseBody对象,封装了HTTP响应的主体数据,它的String()方法将这些数据转换为字符串,另一个byteStream()方法则返回一个InputStream流
注意事项
1.需要独立的线程中执行网络操作
2.对于超过1MB的响应body,应使用留的方式来处理body
Get异步请求
在另外的工作线程中执行http请求,请求时不会阻塞当前的线程,所以可以再Android主线程中使用
异步请求需要加入到一个请求队列中,并且要指定回调方法
图片加载框Glide
Glide是由Google开源的一个图片加载库,是快速高效的Android开源媒体管理和图像加载框架
它将媒体解码、内存和磁盘缓存一级资源池包装成简单易用的界面
加载图片的一般方法:Glide.with(Context context).load(Strint url).into(ImageView imageView);
Glide集成OkHttp加载http图片
导入依赖
创建支持https的OKHttpClient对象
创建继承AppGlideModule类的自定义类,重写registerComponents()方法
使用时,用GlideApp替代Glide类
Volley
官网: https: //github. com/google/volley
在app的build. gradle导入依赖
implementation ' com. android. volley:volley:1.1.1'
Volley的开发流程
创建一个RequestQueue对象
创建一个Request对象
将Reques t对象添加到RequestQueue里面
开发步骤
创建Reques tQueue对象
创建ImageLoader对象,ImageLoader的构造函数接收两个参数, 第1个参数是RequestQueue对象,第2个参数是ImageCache对象
获取ImageListener对象:
1.通过ImageLoader的getImageListener( )方法获取这个对象
2.getImageListener()方法接收3个参数,第1个参数指定用于显示图片的ImageView控件,第2个参数指定加载图片的过程中显示的图片,第3个参数指定加载图片失败时示的图片
调用ImageLoader的get()方法加载网络上的图片,get()方法接收2个参数,第1个参数是图片的url地址,第2个参数是ImageListener对象
作者:ゞ一輩孓&_嘅諾訁呢ゞ
链接:https://juejin.im/post/5dc8bff75188252afa74159a
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。