网络编程知识点

751 阅读10分钟

网络的基本概念

网络的基本知识

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通信,就是不加密的通信,所有的信息明文传播,带来了三大风险:

  1. 窃听风险:第三方可以获知通信内容。

  2. 篡改风险:第三方可以修改通知内容。

  3. 冒充风险:第三方可以冒充他人身份参与通信。

SSL/TLS协议是为了解决这三大风险而设计的,希望达到:

  1. 所有信息都是加密传输,第三方无法窃听。
  2. 具有校验机制,一旦被篡改,通信双方都会立刻发现。
  3. 配备身份证书,防止身份被冒充。

基本的运行过程
SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。但是这里需要了解两个问题的解决方案。

  1. 如何保证公钥不被篡改?

解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。

  1. 公钥加密计算量太大,如何减少耗用的时间?

解决方法:每一次对话(session),客户端和服务器端都生成一个“对话密钥”(session key),用它来加密信息。由于“对话密钥”是对称加密,所以运算速度非常快,而服务器公钥只用于加密“对话密钥”本身,这样就减少了加密运算的消耗时间。

因此,SSL/TLS协议的基本过程是这样的:

  1. 客户端向服务器端索要并验证公钥。

  2. 双方协商生成“对话密钥”。

  3. 双方采用“对话密钥”进行加密通信。

上面过程的前两布,又称为“握手阶段”。 SSL/TLS协议的基本思路是采用公钥加密法,也就是说,客户端先向服务器端索要公钥,然后用公钥加密信息,服务器收到密文后,用自己的私钥解密。但是这里需要了解两个问题的解决方案。

  1. 如何保证公钥不被篡改?

解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。

  1. 公钥加密计算量太大,如何减少耗用的时间?

解决方法:每一次对话(session),客户端和服务器端都生成一个“对话密钥”(session key),用它来加密信息。由于“对话密钥”是对称加密,所以运算速度非常快,而服务器公钥只用于加密“对话密钥”本身,这样就减少了加密运算的消耗时间。

因此,SSL/TLS协议的基本过程是这样的:

  1. 客户端向服务器端索要并验证公钥。

  2. 双方协商生成“对话密钥”。

  3. 双方采用“对话密钥”进行加密通信。

上面过程的前两布,又称为“握手阶段”。

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目录中(需要下载android 6.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
基于网络队列,适合小数据频繁通信, 请求线程池默认大小为4 OkHttp
高性能的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对象