网络编程知识点

网络的基本概念

网络的基本知识

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

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

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

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

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

所有信息都是加密传输,第三方无法窃听。

具有校验机制,一旦被篡改,通信双方都会立刻发现。

配备身份证书,防止身份被冒充。

基本的运行过程

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

如何保证公钥不被篡改?

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

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

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

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

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

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

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

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

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

如何保证公钥不被篡改?

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

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

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

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

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

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

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

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

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目录中(需要下载android6.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

基于网络队列,适合小数据频繁通信, 请求线程池默认大小为4OkHttp

高性能的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对象

作者:ゞ一輩孓&_嘅諾訁呢ゞ

链接:https://juejin.im/post/5dc8bff75188252afa74159a

来源:掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,204评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,091评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,548评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,657评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,689评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,554评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,302评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,216评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,661评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,851评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,977评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,697评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,306评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,898评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,019评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,138评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,927评论 2 355

推荐阅读更多精彩内容