-
1:BIO 服务端一个线程会负责一个连接,进行请求的处理和响应,比较明显,当客户端比较多的时候,服务端的线程可能就不够了,这时候对应的请求就没法及时处理了
客户端个数:服务端处理线程个数=1:1
IO类型:阻塞同步
API使用难度:简单
调试难度:简单
可靠性:比较差
吞吐量:低
2:伪异步IO 服务端会维护一个线程池来处理请求端的请求,也比较明显,当客户端的请求比较多的时候,线程池的线程也是不够的,此时也会出现请求处理阻塞的情况
客户端个数:服务端处理线程个数=m:n
IO类型:阻塞同步
API使用难度:简单
调试难度:简单
可靠性:比较差
吞吐量:中
3:NIO 这个是当前比较牛逼的技术 了,服务端通过缓存区、通道、多路复用等技术,允许客户端的请求成千上万,读写都首先通过缓存区来承接,然后通过通道来传输信息,通过多路复用器轮询通道,看看是否存在读或者写时间,然后再进行处理,大大提升了IO处理的性能和稳定性
客户端个数:服务端处理线程个数=m:0
IO类型:非阻塞同步
API使用难度:非常复杂,所以,给了Netty机会
调试难度:复杂
可靠性:比较高
吞吐量:高
4:AIO 异步IO,简化了NIO的通信模型
IO类型:非阻塞异步
API使用难度:复杂
调试难度:复杂
可靠性:比较高
吞吐量:高
查看全部 -
WebSocket生命周期:
1、打开事件:端点上建立新链接时,该事件是先于其他任何事件发生之前。该事件发生会产生三部分信息。
1.1、创建WebSocket Session对象:用于表示已经建立好的链接
1.2、配置对象:包含配置端点的信息。
1.3、一组路径参数,用于打开节点握手时,WebSocket端入栈匹配的URI
2、消息事件:主要是接收WebSocket对话中,另一端发送的消息。链接上的消息将会有三种形式抵达客户端。
2.1、文本消息 用String处理
2.2、二进制消息 用byteBuffer或者byte[]处理
2.3、pong消息 用Java WebSocket API中的pong.message接口的实例来处理
3、错误事件:WebSocket链接或者端点发生错误时产生。可以处理入栈消息时发生的各种异常。入栈消息可能产生的三种异常。
3.1、WebSocket建立链接时发生错误:SessionException类型
3.2、WebSocket试图将入栈消息解码成开发人员使用的对象时 EncodeException类型
3.3、WebSocket端点的其他方法运行时产生的错误,WebSocket实现将记录端点操作过程中产生的任何异常
4、关闭事件:WebSocket链接端点关闭,做一些清理工作,可以由参与连接的任意一个端点发出。
查看全部 -
AIO通信:它是连接注册读写事件和回调函数,读写方法异步,同时它是主动通知程序。AIO异步通信提供了两种方式获取操作结果:第一种方式是通过java.util.concurrent的Future类来表示异步操作的结果;第二种方式是在执行异步操作的时候传入一个java.nio.channels.CompletionHandler接口的实现类作为操作完成回调。NIO的异步套接字回调,是真正的异步非阻塞IO,对应于Unix网络编程中的事件驱动IO,不需要通过多路复用器对被注册的通道进行轮询操作即可实现异步读写,从而简化NIO的编程模型。
查看全部 -
什么是Netty?
Netty是一个高性能事件驱动,异步非阻塞的IO Java开源框架,由Jboss提供,用于建立Tcp等底层的链接,基于Netty可以建立高性能的Http服务器,快速开发高性能、高可靠的网络服务器和客户端程序。支持Http、websocket,tcp,udp等协议。同时Netty又是基于NIO的客户端,服务器端编程框架,使用Netty可以确保快速和简单的开发出一个网络应用。例如实现了某种协议的客户端服务端应用。Netty简化了网络应用的开发过程,比如tcp,udp的socket服务开发。同时Netty提供了非常可靠的稳定性和良好的伸缩性。
查看全部 -
解析:https://blog.csdn.net/java_3y/article/details/79360834
查看全部 -
查看全部
-
WebSocket建立连接过程:
1、客户端发起握手请求。
2、服务端响应请求。
3、建立连接。
详细流程:
建立一个WebSocket连接,客户端或浏览器首先向服务器发送一个特殊的Http请求(携带一些附加头信息)Upgrade:websocket,服务端解析附加头信息,产生应答消息,然后响应给客户端,之后客户端就与服务端建立响应的链接。
查看全部 -
WebSocket的优点:
节省通信开销,之前WebServer实现通信,都使用轮询(每隔特定时间间隔浏览器自动发送Http请求,去获取服务端的响应)该情况下,需要不停的向服务器发送请求,而HttpRequest的handler很长,请求包含真正的数据可能很小,会占用很多额外的带宽和服务器资源。
服务器主动传送数据给客户端,在给定时间,服务器和客户端在任意时刻相互推送信息,浏览器(客户端)和服务器只需要做一个握手的动作。建立连接后,服务器可主动传数据给客户端,客户端也可以随意向服务端传数据。交换数据时所携带的头信息很小。
实时通信:WebSocket不仅限于Ajax方式通信。ajax方式需要浏览器发起请求。而WebSocket技术 服务端和客户端可以彼此相互推送信息,从而实现实时通信。
查看全部 -
四种IO对比:(IO类型,客户端个数,API使用难度,调试难度,可靠性,吞吐量)
BIO: 阻塞同步的IO,客户端的个数与服务端的IO线程数呈1比1的关系,API使用简单,调试比较简单,可靠性非常差,吞吐量非常低
伪异步IO: 阻塞同步的IO,客户端的个数与服务端的IO线程数呈M比N的关系,API使用简单,调试简单,相比于BIO的可靠性,来说相对好一点,但也很差,吞吐量中等
NIO: 非阻塞同步的IO,客户端的个数与服务端的IO线程数呈M比1的关系, API使用复杂,调试相对复杂,可靠性要高一些,吞吐量高
AIO: 非阻塞异步IO,客户端的个数与服务端的IO线程数呈M比0的关系,不需要启动额外的IO线程,它是被动回调的,API使用复杂,调试相对复杂,可靠性比较高,吞吐量比较高
查看全部 -
NIO通信:
缓存区Buffer: 它是一个对象,它包含一些要写入或要读出的数据,在NIO中加入Buffer对象,体现了新库与原IO的重要区别。在面向流的IO中,可以将数据直接写入或者将数据直接读到Strem对象中。在NIO中,所有数据都是用缓冲区进行处理的,在读取数据时,直接读缓冲区中,在写入数据时,是直接写入缓冲区中。任何时候处理NIO中的数据时都是通过缓冲区进行操作。
通道Channel: 网络数据通过通道Channel读取和写入,通道与流的不同之处在于通道是双向的,而流只是在一个方向上移动,一个流必须是InputStream或OutputStream的子类,而通道可以用于读写或二者同时进行。
多路复用器selector: selector提供了选择已经就绪的任务的能力,会通过不断轮询在其上的Channel,在某个Channel上面发生读或者写事件,则该Channel处于就绪状态,会被Selector轮询出来,然后获取Channel的集合进行后续IO的操作。
NIO通信并没有最大连接数的限制,可以接入成千上万的客户端
查看全部 -
伪异步IO通信模型:
当有N个新的客户端接入的时候,伪异步IO通信将客户端的socket封装成一个Task投递到后端的线程池中进行处理,JDK的线程池负责维护一个消息队列和N个活跃的线程,它与BIO通信模型最大的不同点是:伪异步IO通信的服务端不再针对每一个客户端都创建一个独立的线程,它是由一个线程池来统一处理所有客户端的接入请求。
当有大量客户端接入的时候,并发量不断上涨,将会出现线程池阻塞问题。
查看全部 -
666
template class methods
查看全部 -
Netty的优势
拥有NIO的性能优势,但是没有了NIO的使用难度,使用简单、性能高、稳定、成熟、入门门槛低,像极了一位成熟优雅的女士。
查看全部 -
Netty是啥东西?
Netyy是穿着马甲的NIO
Netty之所以流行是因为,1:性能高,2:容易用,3:稳定可伸缩
查看全部 -
| IO通信 | 客户端个数 |IO类型 | 调试难度 | 吞吐量 |
| -------: | -----: | ---: | ----: | -----: |
|同步阻塞IO | 1 : 1 | 同步阻塞IO | 简单 | 低|
|伪异步IO | M:N | 同步阻塞IO | 简单 | 低|
|NIO | M:1 | 同步非阻塞 | 复杂 | 高|
|AIO[异步NIO] | M:0 | 异步非阻塞 | 复杂 | 高|
AIO 不需要启动额外线程,是被动回调
查看全部
举报