夜光序言:
所有的忧伤都是过往,当时间慢慢沉淀,你会发现,自己的快乐比想象的多得多。
正文:
9.NIO通信步骤:
1.创建serverSoketChannel,配置为非阻塞模式
2.绑定监听,配置TCP参数,录入backlog
3.创建一个独立的IO线程,用于轮回多路复用器selector
4.创建selector,将之前创建的serverSoketChannel注册到selector上并设置监听标识为selectionKey.ACCEPT
5.启动IO线程,在循环体中执行selector.select()方法,轮询就绪的通道
6.当轮询到了处于就绪的通道时,需要判断操作位,如果是ACCEPT状态,说明是新的客户端接入,则调用accept方法接受新的客户端
7.设置新接入客户端的一些参数,如:非阻塞、并将其通道继续注册到selector中,设置监听标识等
8.如果轮询的通道操作方位是READ则进行读取,构造Buffer对象等
9.更细节的还有数据没发送完成继续发送的问题
10.AIO概念:
AIO编程,在NIO基础之上引入了异步通道的概念,并提供了异步文件和异步套接字通道的实现,从而咋真正意义上实现了异步非阻塞,NIO只是非阻塞并非异步,而AIO不需要通过多路复用器对注册的通道进行轮询操作即可实现异步读写,从而简化了NIO编程模型,也可以成为NIO2.0,这种模式才真正的属于异步非阻塞的模型。
11.AIO类:
AsynchronousServerSoketChannel、AsynchronousSoketChannel
12.Netty:
netty是基于java NIO的网络应用框架,使用netty可以快速开发网络应用,比如:服务器客户端协议,netty是异步的。
13.Netty实现通信的步骤:
1.创建两个NIO线程组,一个用于网络事件处理(接收客户端的连接),一个进行网络通信读写
2.创建一个serverBootstrap对象,配置Netty一系列参数,比如:接收传输数据的缓存大小等
3.创建一个实际处理数据的ChannelInittializer,进行初始化的准备工作,比如:设置接收传出数据的字符集、格式、已经实际处理数据的接口
4.绑定端口,执行同步阻塞方法等待服务器端启动即可
14.TCP粘包、拆包问题:
TCP是一个流协议,就是没有界限的遗传数据,它会根据TCP缓冲区的实际情况进行包的划分。
15.TCP粘包、拆包解决方案:
1.DelimiterBasedFrameDecoder类(自定义分隔符)
2.FixedLengthFrameDecoter(定长度)
16.TCP粘包、拆包解决方案,根据业界主流协议:
1.消息定长,比如:每个报文的固定大小固定为200字节,如果不够,空位补空格。
2.在包尾部增加特殊字符进行分割,比如:回车
3.将消息分为消息头和消息体,在消息头中包含表示消息总长度的字段,然后进行业务逻辑的处理。
17.netty编解码技术:
编解码技术就是java序列化技术,序列化的目的是
1.进行网络传输,
2.对象持久化,虽然可以使用java进行序列化,netty网络传输,但是java序列化硬伤太多,比如:java序列化无法跨语言,序列化后码流太大,序列化性能太低。
18.主流的编解码框架:
Jboss的Marshalling包、Google的protobuf、基于protobuf的kyro、messagePack框架
19.Jboss Marshalling
Jboss Marshalling是java对象序列化包,对JDK默认的序列化框架进行了优化,但又保持跟java.io.Serializable接口的兼容,同时增加了可调的参数,和附加特性。
20.netty的UDP协议:
UDP是用户数据报协议,是OSI参照模型中一种无连接的传输层协议,提供面向事务简单不可靠信息传送服务。
21.netty的webSoket:
webSoket将网络套接字引入到客户端和服务端,实现聊天功能需要古老的soket技术,或者是DWR框架,反向ajax技术,再有可能是comet服务推技术,H5的WebSoket很轻松的可以进行聊天功能实现,Netty和H5的webSoket结合简单。
WebSoket的特点:
1.单一TCP连接,双方可通信
2.对代理、防火墙、路由器透明
3.无头部信息、cookie和身份验证
4.无安全开销
5.通过ping/pong保持链路激活
6.服务器可主动传递消息给客户端不需要客户端轮询
22.数据通信:
需要了解下真正项目应用中如何去考虑netty的使用,对于一些参数设置都是根据服务器性能决定的,需要考虑的问题是两台机器(甚至多台)使用netty怎么进行通信,大体可以分为三种:
1.使用长连接通道不断开的形式进行通信,也就是服务器和客户端的通道一直处于开启状态,如果服务器性能足够好,并且客户端的数量也比较少的情况下推荐使用这种方式。
2.一次性批量提交数据,采取短连接方式,也就是把数据保存在本地临时缓冲区或者临时列表里,当达到临界值时进行一次性提交,或者根据定时任务轮询提交,这种情况的弊端是做不到实时性传输,在对实时性不高的情况下可以使用。
3.可以使用一种特殊的长连接,在指定某一时间内,服务器与某台客户端没有任何通信,则断开连接,下次连接则是客户端向服务器发送请求的时候,再次建立连接,这种模式需要考虑两个因素:1.如何在超时(即服务器和客户端没有任何通信)后关闭通道?关闭通道后如何再次建立连接?
客户端宕机时无需考虑,下次客户端重启之后就可以与服务器建立连接但是服务器宕机时,客户端如何与服务端进行连接?
23.Http协议:
Http(超文本传输协议)是建立在TCP 传输协议之上的应用层协议,目前只针对于WEB开发,HTTP协议应用广泛,因此掌握HTTP协议的开发非常重要。
24.Http特点:
简单:客户端请求服务器时只需要指定URL和携带必要的参数即可
灵活:HTTP协议允许传输任意类型的数据对象,传输内容由Http消息头中的content-type加以标记
无状态:Http是无协议状态的,无状态指的是协议对事务处理没有记忆能力,这就意味着如果后续需要处理之前的消息,则它必须重新获取,也从侧面体现Http的设计是为了使网络传输更加轻量级、敏捷、负载较轻。
25:Http协议组成:
请求头、请求行、请求正文(实体内容)
26.Http请求方式:
1.GET:获取Request-URL锁标识的资源
2.POST:在Request-URL所标识的资源附加新的提交数据
3.HEAD:请求获取由Request-URL所标识的资源的响应消息头
4.PUT:请求服务器存储一个资源,并用Request-URL作为标识
5.DELETE:请求服务器删除Request-URL锁标识的资源
6.TRACE:请求服务器回送收到的请求信息,主要是测试和诊断使用(@trace)
7.CONNECT:保留将来使用
8.OPTIONS:请求查询服务器的性能忙活着查询相关资源的选项和需求
27.Http响应的消息:
响应消息是由三部分组成的:状态行、消息头、响应正文
28.响应状态种类:
1xx:提示消息,表示请求已经接收继续处理
2xx:成功,表示请求已经接收成功
3xx:重定向,要完成的请求必须进行更进一步的操作
4xx:客户端错误,可能是请求语法错误或者请求无法实现
5xx:服务端错误,服务器未能处理请求(可能内部出现异常)
29.常见相应的状态码:
200:OK :成功
400:BadRequest: 错误的请求语法,不能被服务器理解
401:Unautthorized :请求未经授权
403:Forbidden: 服务器收到请求但请求被服务器拒绝
404:not found: 请求资源不存在
405:methodNotallowed: 请求方式不被允许,如只支持GET请求,但客户端使用了POST请求
500:inernalServerError 服务器发送不可预期的错误
503:ServerUnavailble 服务器当前不能处理客户端请求,一段时间后可能恢复正常
30. Netty Http文件服务器开发:
Netty的Http协议无论从性能上还是可靠性上都表现优异,非常适合WEB容器的场景下引用,相比于传统的Tomcat、Jetty等容器,更加的轻量和小巧,灵活性和制定性也更好