CrazyDailyQuestion icon indicating copy to clipboard operation
CrazyDailyQuestion copied to clipboard

每日一问: 水滴石穿,聚沙成塔,坚持数月, 必有收获~

Results 100 CrazyDailyQuestion issues
Sort by recently updated
recently updated
newest added

retrofit是基于okhttp的,因此retrofit所有的工作都是围绕在请求体和响应体来展开的,Retrofit提供了各种类型的转换器以及可以自定义转换器,去构建你的请求体,以及通过转换器去序列化响应体为你想要的类型,从而保证你的请求体和响应体都是安全的

### 1. project/build.gradle 在 project/build.gradle 添加如下代码: ```groovy classpath 'com.novoda:bintray-release:0.9.2' ``` ### 2. your_moudle/build.gradle 为了上传到JCenter ```groovy apply plugin: 'com.novoda.bintray-release' publish { userOrg = 'microkibaco' //在https://bintray.com上注册的用户名 groupId = 'com.microkibaco.github' //jCenter上的路径 artifactId =...

# 1、初步认识 ## 观察者模式的定义:   在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。 ## 大白话:   其实就是发布订阅模式,发布者发布信息,订阅者获取信息,订阅了就能收到信息,没订阅就收不到信息。 # 2、这个模式的结构图 ![image](https://user-images.githubusercontent.com/17723631/97501099-aef00680-19ab-11eb-8afc-ed390e4329f8.png) # 3、可以看到,该模式包含四个角色 - **抽象被观察者角色**:也就是一个抽象主题,它把所有对观察者对象的引用保存在一个集合中,每个主题都可以有任意数量的观察者。抽象主题提供一个接口,可以增加和删除观察者角色。一般用一个抽象类和接口来实现。 - **抽象观察者角色**:为所有的具体观察者定义一个接口,在得到主题通知时更新自己。 - **具体被观察者角色**:也就是一个具体的主题,在集体主题的内部状态改变时,所有登记过的观察者发出通知。 - **具体观察者角色**:实现抽象观察者角色所需要的更新接口,一边使本身的状态与制图的状态相协调。 # 4、使用场景例子   有一个微信公众号服务,不定时发布一些消息,关注公众号就可以收到推送消息,取消关注就收不到推送消息。

#### IP地址 ![image](https://user-images.githubusercontent.com/17723631/97497538-9c72ce80-19a5-11eb-809b-5f0afe220e24.png) #### 端口号 ![image](https://user-images.githubusercontent.com/17723631/97497554-a4327300-19a5-11eb-9eff-6c79a7c03ade.png) 端口号规定为16位,即允许一个IP主机有2的16次方65535个不同的端口。其中: - 0~1023:分配给系统的端口号 > 我们不可以乱用 > 常用协议使用的端口:HTTP:80,FTP:21,TELNET:23 - 1024~49151:登记端口号,主要是让第三方应用使用 > 但是必须在IANA(互联网数字分配机构)按照规定手续登记, - 49152~65535:短暂端口号,是留给客户进程选择暂时使用,一个进程使用完就可以供其他进程使用。 > 在Socket使用时,可以用1024~65535的端口号

- 定义:即客户端/服务器结构,是软件系统体系结构 - 作用:充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。 > Socket正是使用这种结构建立连接的,一个套接字接客户端,一个套接字接服务器。 如图: ![image](https://user-images.githubusercontent.com/17723631/97497326-4b62da80-19a5-11eb-8e99-d2e53793bd5d.png) 可以看出,Socket的使用可以基于TCP或者UDP协议。

#### TCP - 定义:Transmission Control Protocol,即传输控制协议,是一种传输层通信协议 > 基于TCP的应用层协议有FTP、Telnet、SMTP、HTTP、POP3与DNS。 - 特点:面向连接、面向字节流、全双工通信、可靠 - **面向连接**:指的是要使用TCP传输数据,必须先建立TCP连接,传输完成后释放连接,就像打电话一样必须先拨号建立一条连接,打完后挂机释放连接。 - **全双工通信**:即一旦建立了TCP连接,通信双方可以在任何时候都能发送数据。 - **可靠的**:指的是通过TCP连接传送的数据,无差错,不丢失,不重复,并且按序到达。 - **面向字节流**:流,指的是流入到进程或从进程流出的字符序列。简单来说,虽然有时候要传输的数据流太大,TCP报文长度有限制,不能一次传输完,要把它分为好几个数据块,但是由于可靠性保证,接收方可以按顺序接收数据块然后重新组成分块之前的数据流,所以TCP看起来就像直接互相传输字节流一样,面向字节流。 - TCP建立连接 必须进行**三次握手**:若A要与B进行连接,则必须 - 第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;然后,客户端进入SYN_SEND状态,等待服务器的确认。即A发送信息给B - 第二次握手:服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认。即B收到连接信息后向A返回确认信息 - 第三次握手:客户端收到服务器的(SYN+ACK)报文段,并向服务器发送ACK报文段。即A收到确认信息后再次向B返回确认连接信息 > 此时,A告诉自己上层连接建立;B收到连接信息后告诉上层连接建立。...

因为tcp是全双工,为保证传输的可靠性,需要给每次传输的数据段添加序号,那么初始的序列号就是tcp三次握手真正的意义所在,而为了确保交换双方的初始序号,最少需要三次才行 采用“三次握手”的办法可以防止上述现象发生: - Client不会向Server的确认发出确认 - Server由于收不到确认,就知道Client并没有要求建立连接 - 所以Server不会等待Client发送数据,资源就没有被浪费 - TCP释放连接 TCP释放连接需要**四次挥手**过程,现在假设A主动释放连接:(数据传输结束后,通信的双方都可释放连接) - 第一次挥手:A发送释放信息到B;(发出去之后,A->B发送数据这条路径就断了) - 第二次挥手:B收到A的释放信息之后,回复确认释放的信息:我同意你的释放连接请求 - 第三次挥手:B发送“请求释放连接“信息给A - 第四次挥手:A收到B发送的信息后向B发送确认释放信息:我同意你的释放连接请求 > B收到确认信息后就会正式关闭连接; A等待2MSL后依然没有收到回复,则证明B端已正常关闭,于是A关闭连接 ![image](https://user-images.githubusercontent.com/17723631/97496781-71d44600-19a4-11eb-8f22-7f8c061edae8.png)

为了保证双方都能通知对方“需要释放连接”,即在释放连接后都无法接收或发送消息给对方 - 需要明确的是:TCP是全双工模式,这意味着是双向都可以发送、接收的 - 释放连接的定义是:双方都无法接收或发送消息给对方,是双向的 - 当主机1发出“释放连接请求”(FIN报文段)时,只是表示主机1已经没有数据要发送 / 数据已经全部发送完毕; > 但是,这个时候主机1还是可以接受来自主机2的数据。 - 当主机2返回“确认释放连接”信息(ACK报文段)时,表示它已经知道主机1没有数据发送了 但此时主机2还是可以发送数据给主机1 - 当主机2也发送了FIN报文段时,即告诉主机1我也没有数据要发送了 此时,主机1和2已经无法进行通信:主机1无法发送数据给主机2,主机2也无法发送数据给主机1,此时,TCP的连接才算释放