由于毕设需要做即时通讯,看了许多即时通讯可能需要的技术,比如轮询,socket,纯websocket,netty,最终选择了netty+websocket,轮询和socket的先排除了,毕竟这种浪费资源的技术学了也施展空间也不大,websocket和netty看了几天,大概了解了一下,最终决定学Nettty+websocket做完整个通讯而不纯websocket,因为NIO算我的一个还没揭开面纱的短板(之前有想过学NIO,单看源码实在让我头疼,就先保留想着以后再学了),这里有需要的话就学习了.
NIO的技术点大家可以网上看看,我这里暂时只做简单介绍
一 初识Netty
-
Netty是由JBOSS提供的一个java开源框架。
-
Netty提供异步的、事件驱动的网络应用程序框架和工具,可以用来快速开发高性能、高可靠性的网络服务器和客户端程序。
-
Netty是一个基于NIO的客户、服务器端编程框架,使用Netty可以确保你快速和简单的开发一个网络应用,例如实现了某种协议的客户、服务端应用。Netty相当于简化和流线化了网络应用的编程开发过程,例如:基于TCP和UDP的socket服务开发。
-
“快速”和“简单”并不用产生维护性或性能上的问题。Netty是一个吸收了多种协议(包括FTP、SMTP,HTTP等各种二进制文本协议)的实现经验,并经过相当精心设计的项目。最终,Netty成功的找到了一种方式,在保证易于开发的同时还保证了其应用的性能,稳定性和仲缩性。
二 Netty优点
(1)Netty提供了简单易用的API
(2)基于事件驱动的编程方式来编写网络通信程序
(3)更高的吞吐量
(4)学习难度低
三 BIO NIO AIO介绍与区别.
阻塞与非阻塞
主要指的是访问IO的线程 是否会阻塞(或者说是等待)
线程访问资源,该资源是否准备就绪的一种处理方式。
同步和非同步
主要是指的数据的请求方式
同步和异步是指访问数据的一种机制
三种IO模型
BIO
同步阻塞IO,Block IO,IO操作时会阻塞线程,并发处理能力低。
我们熟知的Socket编程是BIO,一个socket连接一个处理线程(这个线程负责这个Socket连接的一系列数据传输操作)。阻塞的原因在于:操作系统允许的线程数量是有限的,多个socket申请与服务端建立连接时,服务端不能提供相应数量的处理线程,没有分配到处理线程的连接就会阻塞等待或被拒绝。
NIO 同步非阻塞 IO,None-Block IO
所有的连接过来之后我们用selector进行连接,轮询,只有有IO需求的我们才建立线程供其工作
NIO 是对 BIO 的改进,基于 Reactor 模型。我们知道,一个 socket 连接只有在特定的时候才会发生数据传输 IO 操作,大部分时间这个“数据通道”是空闲的,但还是占用着线程。NIO 作出的改进就是“一个请求一个线程”,在连接到服务端的众多 socket 中,只有需要进行 IO 操作的才能获取服务端的处理线程进行 IO。这样就不会因为线程不够用而限制了 socket的接入
AIO(NIO 2.0)
异步非阻塞IO
这种IO模型是由操作系统先完成了客户端请求处理 再通知服务解去启动线程进行处理。 AIO也称NI02.0,在JDK7开始支持。
四 Netty Reactor 模型
- 单线程模型
- 多线程模型
- 主从多线程模型
1.单线程模型(接受请求和处理请求都是同一个线程)
用户发起 IO 请求到 Reactor 线程
Ractor 线程将用户的 IO 请求放入到通道,然后再进行后续处理
处理完成后,Reactor线程重新获得控制权,继续其他客户端的处理
4.某一个事件处理器发生故障,不能继续处理其他事件这种模型一个时间点只有一个任务在执行,这个任务执行完了,再去执行下一个任务。
1.单线程的Reactor模型每一个用户事件那在一个线程中执行:
2.性能有极限,不能处理成百上千的事件
3.当货荷达到一定程度时,性能将会下降
2 Reactor多线程模型.(接收请求是单个线程,处理请求的是一个线程池(多个线程))
Reactor多线程模型是由一组NIO线程来处理IO操作(之前是单个线程),所以在请求处理上会比上一中模型效率更高,可以处理更多的客户端请求。
这种模式使用多个线程执行多个任务,任务可以同时执行
3 Reactor主从多线程模型.(接收请求的是一个线程池,处理请求的是一个线程池 )
这种线程模型是Netty 推荐使用的线程模型这种模型适用于高并发场景,一组线程池接收请求,一组线程池处理IO.
写了一个websocket+netty的实战demo,可以先看这个https://www.jianshu.com/p/117c400f87a6,也可以后面等着看我的1:1仿网页微信的聊天工具
网友评论