网络编程
网络基础知识
IP地址和端口号
- IP地址:网络中每台计算机都有唯一的IP地址作为标识
- 端口号:计算机中正在运行的进程
网络协议
- OSI七层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层
- TCP/IP概念模型:应用层、传输层、网络层、链路层
传输层常用的两种协议TCP UDP
- 传输控制协议TCP:提供面向连接的,可靠的数据传输服务
- 用户数据协议UDP:提供无连接的,尽最大努力的数据传输服务(不保证数据传输的可靠性)
UDP的主要特点
-
UDP 是无连接的;
-
UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态(这里面有许多参数);
-
UDP 是面向报文的;
-
UDP 没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如 直播,实时视频会议等);
-
UDP 支持一对一、一对多、多对一和多对多的交互通信;
-
UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短。
TCP的主要特点
- TCP 是面向连接的。(就好像打电话一样,通话前需要先拨号建立连接,通话结束后要挂机释放连接);
- 每一条 TCP 连接只能有两个端点,每一条 TCP 连接只能是点对点的(一对一);
- TCP 提供可靠交付的服务。通过 TCP 连接传送的数据,无差错、不丢失、不重复、并且按序到达;
- TCP 提供全双工通信。TCP 允许通信双方的应用进程在任何时候都能发送数据。TCP 连接的两端都设有发送缓存和接收缓存,用来临时存放双方通信的数据;
- 面向字节流。TCP 中的“流”(Stream)指的是流入进程或从进程流出的字节序列。“面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块(大小不等),但 TCP 把应用程序交下来的数据仅仅看成是一连串的无结构的字节流。
HTTP与HTTPS的区别
- 端口不同:Http 与 Http 使用不同的连接方式,用的端口也不一样,前者是 80,后者是 443;
- 资源消耗:和 HTTP 通信相比,Https 通信会由于加减密处理消耗更多的 CPU 和内存资源;
- 开销:Https 通信需要证书,而证书一般需要向认证机构购买;
- Https 的加密机制是一种共享密钥加密和公开密钥加密并用的混合加密机制。
HTTP协议
- 应用层面向对象的协议
- 特点:支持c/s模式
简单快速(只需要传送请求方法和路径)
灵活(允许传输任意类型的数据对象)
无连接(限制每次连接只处理一个请求)
无状态(对事物处理没有记忆功能)
HTTP请求报文
- 组成部分:请求行、请求报头、空行、请求数据
- 请求行:声明请求方法、主机域名、资源路径&协议版本
- 请求头:声明客户端、服务器、报文的部分信息
- 请求体:存放需要发送的数据信息
HTTP响应报文
- 组成部分:状态行、消息报头、空行、响应正文
- 状态行:声明协议版本、状态码、状态码描述
- 响应头:声明客户端、服务器、报文的部分信息
- 响应体:存放需发送的数据信息
网络编程
通信方式
- Http通信方式(HttpURLConnection、HttpClient)
- Socket通信方式
URL类
- 统一资源定位符(URL):对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址
- 互联网上的每个文件都有唯一的URL
- URL类提供了多个方法访问URL对应的资源:
URLConnection openConnection():返回一个 URLConnection对象,表示到URL所引用的远程 对象的连接
InputStream openStream():打开URL的连接,返回一个用于读取该URL资源的InputStream
Android URL通信
-
Android HTTP URL接口的基本操作:
1.创建URL以及HttpURLConnection对象
2.连接参数设置
3.连接到服务器
4.向服务器写数据
5.从服务器读取数据 -
HttpURLConnection访问HTTP资源的步骤:
1.根据URL地址创建URL对象
2.使用URL对象的openConnection()方法获取HttpURLConnection对象
3.设置连接的属性,包括GET/POST请求方式
4.输入、输出数据
5.关闭输入、输出流
6.在AndroidManifest配置文件中设置访问INTERNET的权限 -
HttpURLConnection使用的注意事项
1.使用setConnectionTimeout()方法设置连接超时,当网络不好时,Android Q系统会在超过设置时间后收回资源,中断操作
2.通过getResponseCode()对响应码进行判断,如果返回的响应码为200,则表示连接成功
3.对大文件操作时,将文件写到SDCard上,不要直接写到手机内存上
4.操作大文件时,要一边从网络上读取,一边往SDcard上写,减少手机内存的使用
5.对文件流操作完毕后要及时关闭
6.Android4.0后所有的网络通信的操作都不能在主线程上进行,要用独立的线程完成
Android常用的网络编程框架
- Volley:
1.Google官方推出的异步请求库,支持HTTPClient、HttpURLConnection
2.基于网络队列,适合小数据频繁通信,请求线程池默认为4 - OkHttp:
1.高性能的http库,支持同步、异步,而且支持http2、websocket协议,api简洁易用,实现了http缓存
2.Android网络访问的源码已用OkHttp代替了HttpURLConnection - Retrofit:
1.基于OkHttp封装的一套RESTful网络请求框架,底层默认采用okHttp
OkHttp
- 特点:
1.OKHttp是Android版http客户端,非常高效,支持SPDY、连接池、GZIP和HTTP缓存
2.默认情况下,OKHttp会自动处理常见的网络问题,像二次连接、SSL的握手问题
3.如果应用城西继承了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求
4.从Android4.4开始,HttpURLConnection的底层实现采用okHttp
OkHttp开发基本思路
- OkHttp的每次网络请求是一个Request,提供Request必要的参数url、header等,基于Request构造出一个Call对象,在调用它的execute()方法,就能取得Web Server回复的数据
- 如果同步调用,需要在独立的线程中执行,使用异步调用,则采用回调的方式执行,在内部封装了一个请求队列
- OkHttp依赖另一个组件okio完成高性能的I/O操作
- 基本用法:
1.新建一个OkHttpClient对象
2.通过Request.Builder对象新建一个Request对象
3.通过Request对象构造Call对象,调用enqueue()以异步的方式将call加入调度队列,等待reqeuest执行完成
4.通过Call对象的Callback对象返回执行结果
Get同步请求
- 当HTTP响应码位于200到300之间时,认为操作是成功的
- response.body()返回一个ResponseBody对象,封装了HTTP响应的主体数据,它的String()方法将这些数据转换为字符串,另一个byteStream()方法则返回一个InputStream流
- 注意事项
1.需要独立的线程中执行网络操作
2.对于超过1MB的响应body,应使用留的方式来处理body
Get异步请求
- 在另外的工作线程中执行http请求,请求时不会阻塞当前的线程,所以可以再Android主线程中使用
- 异步请求需要加入到一个请求队列中,并且要指定回调方法
Http Header的读写
- 当写请求头的时候,使用header(name,value)可以设置唯一的name、value。如果已经有值,旧的将会被移除,然后添加新的
- 使用addHeader(name,value)可以添加多值(添加,不移除已经有的)
post异步请求
- 通过RequestBody构建请求数据
Post方式提交Multipart文件
- MultiparBuilder可以构建复杂的HTTP Request Body,这与HTML文件上传形式兼容
- 多块请求体中每块请求都是一个请求体,可以定义自己的请求Header,如设定Content-Disposition
- 如果Content-Length和Content-Type可用的话,他们会被自动添加到请求Headers中
图片加载框Glide
- Glide是由Google开源的一个图片加载库,是快速高效的Android开源媒体管理和图像加载框架
- 它将媒体解码、内存和磁盘缓存一级资源池包装成简单易用的界面
- 加载图片的一般方法:Glide.with(Context context).load(Strint url).into(ImageView imageView);
Glide集成OkHttp加载http图片
- 导入依赖
- 创建支持https的OKHttpClient对象
- 创建继承AppGlideModule类的自定义类,重写registerComponents()方法
- 使用时,用GlideApp替代Glide类
- 点赞
- 收藏
- 分享
- 文章举报
- Android初级教程理论知识(第八章网络编程二)
- Java网络编程——11.非阻塞I/O
- Android编程获取网络连接状态(3G/Wifi)及调用网络配置界面
- java网络编程
- Java网络编程之HttpURLConnection
- java 深入理解 网络编程
- Android网络编程之Socket&Http
- 网络编程的原理(端口与服务器互相对话)
- 网络编程之I/O(1)
- Android网络服务开发之Socket编程
- 黑马程序员-网络编程(一)
- C#网络编程(订立协议和发送文件) - Part.4
- linux网络编程-----几种服务器模型及io多路复用函数
- 网络编程常见类型定义
- VC++ 网络SOCKET编程
- c#网络编程学习笔记00_补上一些基础概念
- java 网络编程
- [转]IO模式设置网络编程常见问题总结—IO模式设置,阻塞与非阻塞
- C# socket 网络编程
- Linux网络编程之利用信号量防止僵尸子进程