乐趣区

Android 网络编程基础

网络基础
一、计算机网络体系结构
计算机网络的各层 + 其协议的集合。它定义了该计算机网络所能完成的功能。
计算机网络体系结构分为 3 种:OSI 体系结构、TCP / IP 体系结构、五层体系结构
OSI 体系结构:纯理论的框架性的概念。概念清楚完整,但复杂不实用;TCP / IP 体系结构:不只是划分了功能层,还有具体的实现协议(TCP,IP 协议),是 Internet 的核心协议;五层体系结构:融合了 OSI 与 TCP / IP 的体系结构,目的是为了学习和讲解计算机原理。

二、IP 地址 & 端口号
IP 地址是用于标识网络中的唯一的一个通信实体,这个通信实体既可以是一台主机,也可以是一台打印机,或者是路由器的某一个端口。IP 地址分为公网 IP 地址和私有 IP 地址。公网 IP 是在 Internet 使用的 IP 地址,而私有 IP 地址则是在局域网中使用的 IP 地址。
IP 地址用于标识网络上的一个通信实体,但是一个通信实体可以有多个通信程序同时提供网络服务,此时需要使用端口号,用于表示数据交给哪个通信程序处理。因此,端口就是应用程序与外界交流的出入口。
简单讲,IP 地址就是家庭住址,具体到街道和门牌号,端口就相当于房间号码。当一个程序需要发送数据的时候,需要指定目的地的 IP 地址和端口号。
Android 网络编程基础
Android 与服务器的通信方式主要有两种,一种是 Http 通信,一种是 Socket 通信。

Http 通信:属于应用层,解决的是如何包装数据。工作方式为“请求—响应”,即当客户端向服务器发送请求时才建立连接通道,服务器端才能向客户端返回数据。
Socket 通信:属于传输层,解决的是数据如何在网络中传输的问题。工作方式为“服务器主动发送数据”,即建立网络连接后,服务器可主动发送消息给客户端,不需等待接收。

一、Socket 通讯
Socket 即套接字,是应用层 与 TCP/IP 协议族(传输层)的中间软件抽象层,表现为一个封装了 TCP / IP 协议族 的编程接口(API)。
Socket 的使用类型有两种:1. 流套接字(streamsocket):基于 TCP 协议,采用 流的方式 提供可靠的字节流服务;2. 数据报套接字 (datagramsocket):基于 UDP 协议,采用 数据报文 提供数据打包发送的服务。
1. TCP 传输控制协议
通讯模型(流的方式):
通讯机制(三次握手,四次挥手):
TCP 提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。
2. UDP 用户数据报协议
通讯模型(包的方式):
特点:
3. TCP 与 UDP 区别

流模式与数据报模式;
对系统资源的要求(TCP 较多,UDP 少);
TCP 基于连接,保证数据正确性和数据顺序(可靠)。UDP 无连接,可能丢包,不保证数据顺序(不可靠)。所以,TCP 效率慢,UDP 速度快。

4. 使用
Socket 可基于 TCP 或者 UDP 协议,但 TCP 更加常用。例子是基于 TCP 的:
******* 步骤 1:创建客户端 & 服务器的连接 ********
// 创建 Socket 对象 & 指定服务端的 IP 及端口号
Socket socket = new Socket(“192.168.1.32”, 1989);
// 判断客户端和服务器是否连接成功
socket.isConnected();

******* 接收服务器的数据 ********
// 步骤 1:创建输入流对象 InputStream
InputStream is = socket.getInputStream()
// 步骤 2:创建输入流读取器对象 并传入输入流对象
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
// 步骤 3:通过输入流读取器对象 接收服务器发送过来的数据
br.readLine();

******* 发送数据 到 服务器 ********
// 步骤 1:从 Socket 获得输出流对象 OutputStream。该对象作用:发送数据
OutputStream outputStream = socket.getOutputStream();
// 步骤 2:写入需要发送的数据到输出流对象中
outputStream.write((”Carson_Ho”+”\n”).getBytes(“utf-8”));
// 特别注意:数据的结尾加上换行符才可让服务器端的 readline() 停止阻塞
// 步骤 3:发送数据到服务端
outputStream.flush();

******* 断开客户端 & 服务器 连接 ********
// 断开 客户端发送到服务器 的连接,即关闭输出流对象 OutputStream
os.close();
// 断开 服务器发送到客户端 的连接,即关闭输入流读取器对象 BufferedReader
br.close();
// 最终关闭整个 Socket 连接
socket.close();

二、HTTP 通讯
HTTP 协议即超文本传送协议,HTTP 协议是建立在 TCP 协议之上的一种应用。HTTPS 是 HTTP 的安全版,即 HTTP 下加入 SSL 层。
1. Http 请求 & 响应
请求报文:
响应报文:
部分详解:
2. 请求方法

Get & Post

get 参数通过 url 传递,post 放在 request body 中;
浏览器中 Get 传递数据上限;

因为 get 请求参数是写在 url 里的,而浏览器中 url 长度是有限制的,所以在浏览器中使用 get 传递数据是有限制的。但是,Http 协议本身是不限制的,所以移动端请求无影响。Http 服务器部分有限制的设置一下即可。Post 请求无限制。

Post 比 Get 更安全
后退与刷新。Get 无害,Post 数据会被重新提交。因为,Get 是从服务器上获取,查询数据,对服务器没有改变;Post 是向服务器传送数据,会对服务器数据造成改变。
缓存与历史

Get 能被缓存,参数保留在浏览器历史中。Post 不能缓存,参数不会保存在浏览器历史中。
三、移动端网络优化

不用域名,直连用 IP,省去 DNS 解析过程;
预取;
连接复用;

节省连接建立时间,如开启 keep-alive。默认情况下 HttpURLConnection 和 HttpClient 都开启了 keep-alive。只是 2.2 之前 HttpURLConnection 存在影响连接池的 Bug。
用捆绑批量访问的方式来减少访问的频率;
即将多个请求合并为一个进行请求,如果某个页面内请求过多,也可以考虑做一定的请求合并。
减少请求数据的大小
对于 post 请求,body 可以做 Gzip 压缩,如日志。

减少返回数据的大小
做好网络数据的缓存

参考文章:这是一份详细 & 清晰的计算机网络基础 学习指南

退出移动版