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