标注:本文为个人学习使用,仅做自己学习参考使用,请勿转载和转发
2018-08-27: 初稿,老天鹅啊!你不知道我这月经历了什么!参考博主coder-pig
0. 引言
- 这一部分主要是关于Android的网络编程这一部分。
- Android为什么需要网络编程呢,Http协议、自带的Json解析类解析Json、XML解析、HttpURlConnection和HttpClient的使用、文件的上传、下载WebService的使用、WebView、Socket通信的使用等
- 仅限于Android的客户端,主要是掌握获取与解析服务器反馈数据的能力
1. Android与服务器交互的三种方式
-
数据上传
使用Get/Post等方式上传数据:上传图片、文本、XML、Json数据、音视频文件、调用WebService数据,使用Socket上传大文件等 -
数据下载
下载网络中的数据、图片、代码文本、XML、Json数据、音视频文件、WebService的调用 -
数据浏览
通过WebView浏览网页,通过JS调用Android手机的东西
2. Http协议概述
- 实际开发中我们和服务端打交道一般都是基于Http协议的通信
2.1 什么是Http协议
Hypertext Transfer Protocol超文本传输协议,TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需要遵守一定的通讯格式,Http协议用于定义客户端与Web服务器通讯的格式。
2.2 Http 1.0 与Http1.1 的区别
1.0协议,客户端与web服务器建立连接后,只能获得一个web资源,而1.1协议,允许客户端与web服务器建立连接后,在一个连接上获取多个web组员
3. Http协议的底层工作流程
3.1. 首先有两个名词
SYN(synchronous): TCP/IP建立连接时使用的握手信号
ACK(Acknowledgement): 确认字符,确认发来的数据已经接受无误
3.2. TCP/IP三次握手的概念
1.客户端发送syn包到(syn = j)到服务器,进入到SYN_SEND状态,然后等待服务器确认;
2.服务器收到syn包,确认客户的syn(ack = j + 1), 同时在自己也发送一个syn包(syn = k), 即syn + ack 包,服务器进入syn_recv状态
3.客户端收到syn + ack 包,向服务器发送确认包ack(ack = k + 1),发送完毕后,客户端与服务端进入establised状态,完成三次握手,然后两者开始传送数据
3.3. Http操作的流程
- 用户点击浏览器上的url,Web浏览器与Web服务器建立连接;
- 建立连接后,客户端发送请求给服务器,请求格式为:统一资源标识符URL+协议版本号(一般是1.1)+MIME信息(多个消息头)+一个空行;
- 服务端收到请求后,给予相应的返回信息,返回格式为:协议版本号+状态行(处理结果)+多个信息头+空行+实体内容(比如返回的html)
- 客户端接受服务端返回信息,通过浏览器显示出来,然后与服务端断开连接;当然如果中途某步发生错误的话,错误信息会返回到客户端,并显示,比如经典的404错误
下图为原博主通过测试自己学校的教务系统的截图
HTTP请求包含的内容:
HTTP响应包括的内容:
3.4. Http协议的业务流程
3.5. Http的几种请求方式
实际开发中我们使用比较多的方式就是Get和Post,但是实际开发可能还会用到其他的请求方式,比如Put等
- Get: 请求获取Request-Url所表示的资源
- POST:在Request-Url所标识的资源后附加新的数据
- HEAD:请求获取由Request-Url所表示的资源的相应信息报头
- PUT:请求服务器储存的一个资源,并用Request-Url作为其标识
- Delete:请求服务器删除Request-Url所标识的资源
- TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断
- CONNECT:保留将来使用
- OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项
3.6. Get和Post的对比
- 用的最多的两个,当然要作下对比
- GET:请求的URL地址以后以 ?的形式带上交给服务器的数据,多个数据之间以 & 进行分割,但数据容量通常不能超过2K,比如http://xxx?username=...&pawd=...这个就是Get
- POST:这个则可以正在请求的实体内容中向服务器发送数据,传输没有数量限制
- 这两个都是发送数据的,只是发送的机制不一样,不要相信网上说的“GET获得服务器数据,POSt向服务器发送数据”,另外GET安全性非常低,POST安全性较高,但是执行效率却比Post方法好,一般查询的时候我们使用GET,数据增删改的时候用Post!
3.7. Http状态码合集
- 下面的状态码只是参考,决定权是在服务器,也就是后台上面的,一种方案是请求后,服务器返回给我们的是状态,或者另一种,在应用不用弄多语言版本的时候最好用,直接返回一串结果信息的json给我们,我们直接显示就好,这样可以偷懒不少。
- 100~199 : 成功接受请求,客户端需提交下一次请求才能完成整个处理过程
- 200: OK,客户端请求成功
- 300~399:请求资源已移到新的地址(302,307,304)
- 401:请求未授权,改状态代码需与WWW-Authenticate报头域一起使用
- 403:Forbidden,服务器收到请求,但是拒绝提供服务
- 404:Not Found,请求资源不存在,这个就不用说啦
- 500:Internal Server Error,服务器发生不可预期的错误
- 503:Server Unavailable,服务器当前不能处理客户端请求,一段时间后可能恢复正常
3.8. Http协议的特点
- 支持客户/服务器模式。
- 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、 HEAD、POST。每种方法规定了客户与服务器联系的类型不同。 由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
- 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求, 并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
- 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。 缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每 次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。