网络通信<br />1.网络传输的要素:<br />1. 协议;<br />Udp:广播协议,面向无连接的,速度快,不安全<br />Tcp:面向连接的,因为要经过三次握手,所以比较慢,比较安全<br /> <br />注意:udp和tcp都是基于socket来实现的协议<br /> <br />2.io:网络间的数据传输是通过二进制数据进行传输的,那么也就是使用io流的形式进行传输的<br /> <br />注意:IO的分类<br />1. BIO:同步阻塞io<br />2. AIO:异步非阻塞io<br />3. NIO:同步非阻塞io<br /> <br />注意:这里的同步和异步指的是应用程序和内核的交互:<br /> 同步:排队等待,<br /> 异步:无需等待<br />阻塞:指未得到当前消息就直接挂起不做其他事情<br />非阻塞:即使未得到结果,先去做其他事情了<br /> <br /> <br />3.RPC框架以及原理:主要作用就是将消息进行打包封装以及解压<br /><br /><br /> <br /> <br />远程调用讲解:<br />1. RMI:java原生支持的远程调用,不需要依赖第三方的包,使用的是jrmp协议<br /> <br /> <br />BIO:同步阻塞的io<br /><br />代码案例:<br />服务端:<br /><br />客户端:<br /><br /> <br />NIO:同步非阻塞io:一个请求开辟一个通道<br /><br />1. 客户端的请求注册到多路复用器上面,注册到上面之后,多路复用器就去轮询我们的服务器,看客户端需要执行的对应的哪些读操做和写操做,然后开辟一个通道(channel),多路复用器并监控io的读写请求<br />2. 数据主要是buffer(缓冲区)和channel(通道)之间的交互<br />3. 这里始终使用的是一个线程进行连接<br /> <br /> <br />代码案例:<br /> <br /> <br />NIO缺点:<br />1. 类库和api繁杂,使用麻烦<br />2. 可靠性不强<br />3. Nio的bug,列如epoll bug,会导致selector空轮询,以至于cpu100%<br /> <br />AIO:异步非阻塞:<br /><br />这里客户端将信息只要交给操做系统就好了,什么也不用管,到时候服务端会主动调用回调函数去进行通知<br /> <br />使用场景:连接数目多且比较长的连接,就用aio去实现:相册服务器<br /> <br />注意:**长连接**:客户端和服务端建立连接之后,一次请求之后不会立即关闭,而是保留连接方便下次使用:客户端消失但连接依然存在,比较占资源,这个时候服务端每2个小时发送一次探测报文段给客户端,获取客户端的状态。<br /> **短连接**:客户端和服务端建立连接之后,一次请求之后会立即关闭,一般由客户端发起关闭请求:管理起来简单,意味着存在的连接都是有用的连接<br /> <br /> <br />Netty:异步的,基于事件驱动的网络编程框架:支持socket,也支持http协议<br /><br /><br /> <br />Netty的线程模型:<br />1. 单线程模型:当并发比较高的情况下,单线程的处理效率会非常差<br />2. 线程池模型:<br /> <br />Netty常用组件:<br />1. ChannelHandler接口及其实现类:ChannelInBoundHandlerAdapter<br />使用说明:<br />1. 自定义一个类继承ChannelInBoundHandlerAdapter,并重写里面的相关方法去实现业务逻辑,<br /><br />代码案例:<br /><br /> <br /> 2.ChannelPipeline:Handler集合,负责处理和拦截inbound或者outbound的事件和操做<br /> <br />注意:这里就好比是一条执行链条,在通道中,我们需要先做什么,再做什么,都往这个链条中塞,也就是使用下面的方法,至于first和last类似队列,有队头和队尾的概念<br /><br />代码案例:<br /><br /><br /> <br /> 3.ChannelHandlerContext:这个是每个通道中处理事件的具体工作者,是业务处理中的参数,从而获得对数据的操做:看第一个组件图可知<br /><br /> <br /> <br /> 4.ChannelFuture:channel异步IO操做的结果<br /><br /> <br />5.接口EventLoopGroup和其实现类:NioEventLoopGroup:<br /> 这个类似一个线程池,里面有很多的eventloop,每个eventloop负责维护一个selector。<br /> <br />注意:1.selector:多路复用器<br />2. 我们在消息的提供端(服务端)创建两个线程池,一个用来用户的连接,一个用来连接中数据的读写<br />3. 创建好之后作为参数放在启动助手类之中就好<br />代码案例:<br /><br />6. serverbootstrap和bootstrap<br /> Serverbootstrap是服务端启动助手:<br />Bootstrap:启动引导类<br />代码案例:<br /><br /> <br /> <br />常用组件就讲完了,回过头再仔细阅读代码 然后总结一套流程出来<br /> <br />Netty实战:<br />1. 引入依赖:<br /><br />2. <br />3. <br />4. <br /> <br />1. 服务端:<br />2. 客户端:<br /> <br /> <br />使用netty实现rpc框架原理与实战:<br /> <br /> <br />这个下面就全是代码了 代码我已经全部给你了,你自己总结流程就行了。
