Android的网络编程
Android的网络编程
网络的基本概念
网络的基本知识
IP地址和端口号
IP地址:网络中每台计算机都有唯一的IP地址作为标识
端口号:计算机中正在运行的进程
网络协议
OSI七层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
TCP/IP概念模型:应用层、传输层、网络层、链路层
HTTP 协议
属于应用层的面向对象的协议,适用于分布式超媒体信息系统主要特点
- 支持C/S模式
- 简单快速:只需传送请求方法和路径,请求方法常用的有: GET、HEAD、POST等●灵活:允许传输任意类型的数据对象,用Content -Type进行标记.
- 无连接:限制每次连接只处理一个请求.
- 无状态:对事务处理没有记忆功能.
HTTP的URL的格式: - http://host[: port][/path]
- http表示要通过HTTP协议来定位网络资源; host表示合法的Internet主机域名或者IP地址; port指定一个端口号, 为空则使用默认端口80; path指定请求资源的URI。
HTTP请求报文
- 由请求行、请求报头、空行和请求数据4个部分组成
HTTP相应报文
- 由状态行、消息报头、空行、响应正文组成
HTTPS请求
HTTPS的请求过程
HTTP与HTTPS的区别
- 端口不同:Http 与 Http 使用不同的连接方式,用的端口也不一样,前者是 80,后者是 443;
- 资源消耗:和 HTTP 通信相比,Https 通信会由于加减密处理消耗更多的 CPU 和内存资源;
- 开销:Https 通信需要证书,而证书一般需要向认证机构购买;
- Https 的加密机制是一种共享**加密和公开**加密并用的混合加密机制。
Android的网络访问
通信方式
Http通信方式(HttpURLConnection、HttpClient)
- HttpURLConnection
Android 2.3之后,HttpURLConnection是Android网络编程的最佳选择,它的API简单,体积较小,压缩和缓存机制有效减少网络访问的流量 - HttpClient(自学)
开发团队向开发者建议:在Android 2.2版本及以下可以使用HttpClient,在2.3以上版本则应该使用HttpURLConnection - Android 6.0直接删除了HttpClient类库
Socket通信方式
URL类
- 统一资源定位符(URL):对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址
- 互联网上的每个文件都有唯一的URL
- URL类提供了多个方法访问URL对应的资源:
URLConnection openConnection():返回一个URLConnection对象,表示到URL所引用的远程对象的连接
InputStream openStream():打开URL的连接,返回一个用于读取该URL资源的InputStream
Android URL通信
- Android HTTP URL接口的基本操作:
- 创建URL以及HttpURLConnection对象
- 连接参数设置
- 连接到服务器
- 向服务器写数据
- 从服务器读取数据
HttpURLConnection
- HttpURLConnection访问HTTP资源的步骤:
- 根据URL地址创建URL对象
- 使用URL对象的openConnection()方法获取HttpURLConnection对象
- 设置连接的属性,包括GET/POST请求方式
- 输入、输出数据
- 关闭输入、输出流
- 在AndroidManifest配置文件中设置访问INTERNET的权限
- HttpURLConnection使用的注意事项
- 使用setConnectionTimeout()方法设置连接超时,当网络不好时,Android Q系统会在超过设置时间后收回资源,中断操作
- 通过getResponseCode()对响应码进行判断,如果返回的响应码为200,则表示连接成功
- 对大文件操作时,将文件写到SDCard上,不要直接写到手机内存上
- 操作大文件时,要一边从网络上读取,一边往SDcard上写,减少手机内存的使用
- 对文件流操作完毕后要及时关闭
- Android4.0后所有的网络通信的操作都不能在主线程上进行,要用独立的线程完成
Android的网络框架
- Volley:
- Google官方推出的异步请求库,支持HTTPClient、HttpURLConnection
- 基于网络队列,适合小数据频繁通信,请求线程池默认为4
- OkHttp:
- 高性能的http库,支持同步、异步,而且支持http2、websocket协议,api简洁易用,实现了http缓存
- Android网络访问的源码已用OkHttp代替了HttpURLConnection
- Retrofit:
- 基于OkHttp封装的一套RESTful网络请求框架,底层默认采用okHttp
- Tips:目前网络框架的最好选择:Rxjava + Retrofit + OkHttp
Volley
- Volley的组成:
- 网络请求(StringRequest,JsonArrayRequest,JsonObjectRequest,ImageRequest)。
- 图片加载 ImageLoader
- 自定义ImageView NetworkImageView
- 调用
OKHttp
- 特点:
- OKHttp是Android版http客户端,非常高效,支持SPDY、连接池、GZIP和HTTP缓存
- 默认情况下,OKHttp会自动处理常见的网络问题,像二次连接、SSL的握手问题
- 如果应用城西继承了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求
- 从Android4.4开始,HttpURLConnection的底层实现采用okHttp
OkHttp开发基本思路:
- OkHttp的每次网络请求是一个Request,提供Request必要的参数url、header等,基于Request构造出一个Call对象,在调用它的execute()方法,就能取得Web Server回复的数据
- 如果同步调用,需要在独立的线程中执行,使用异步调用,则采用回调的方式执行,在内部封装了一个请求队列
- OkHttp依赖另一个组件okio完成高性能的I/O操作
基本用法:
- 新建一个OkHttpClient对象
- 通过Request.Builder对象新建一个Request对象
- 通过Request对象构造Call对象,调用enqueue()以异步的方式将call加入调度队列,等待reqeuest执行完成
- 通过Call对象的Callback对象返回执行结果
Retrofit
- 使用步骤:
- 添加Retrofit库的依赖:
- 创建用于描述网络请求 的接口:
- 创建Retrofit实例:
- 发送请求:
请求分为同步请求和异步请求