Netty之WebSocket简单应用


  千锋JAVA开发学院3天前我要分享

1.什么是Netty?

Netty是JBoss提供的一种高性能事件驱动的异步非阻塞IOJava开源框架,用于构建Tcp等低级链接。 Netty可以构建高性能的Http服务器,以快速开发高性能,高可靠性的Web服务器和客户端程序。它支持Http,websocket,tcp,udp和其他协议。与此同时,Netty是一个基于NIO的客户端,服务器端编程框架,使用Netty来确保网络应用程序的快速和简单的开发。例如,实现某种协议的客户端服务器应用程序。 Netty简化了Web应用程序的开发,例如tcp,udp socket服务开发。同时,Netty提供非常可靠的稳定性和良好的可扩展性。

2.Netty使用场景

高性能领域:如游戏,大数据分布式计算被广泛使用

多线程并发:多路复用模型,多线程模型,主从多线程模型

异步通信领域等。

3.JavaIO沟通

在介绍WebSocket之前,让我们简单地谈谈JavaIO通信中的BIO,伪异步IO,NIO和AIO。

(1)BIO沟通

BIO通信:与BIO模型通信的服务器,通常是独立线程,负责监听客户端的连接。收到客户端连接请求后,它会为每个客户端创建一个新线程,执行链接处理和处理。完成后,响应将通过输出流返回给客户端,此时线程将被销毁。这是典型的“一个请求 - 响应”通信模型。

该模型的最大缺点是缺乏弹性可伸缩性。当客户端的并发访问次数增加时,服务器上的线程数和客户端上的并发访问次数将与一对一成比例。由于该线程是Java虚拟机的宝贵系统资源,因此当扩展线程数时,系统的性能将快速下降。随着并发访问继续增加,系统将遇到线程堆栈异常或线程创建失败的问题。最终,该过程将停止或停止,并且不会提供外部服务。

BIO通信模型如下所示:

客户端数量与服务器1:1的线程成比例。

(2)伪异步IO通信

伪异步IO通信:当新客户端访问时,客户端的套接字被封装到要传递到后端线程池以进行处理的任务中。线程池在消息队列中维护消息队列和N个活动线程。任务与处理有关。也就是说,当有M个客户端访问时,服务器将创建一个包含N个线程的线程池来处理客户端的请求。由于线程池可以设置消息队列的大小和最大线程数,因此它的资源消耗是可控的,无论有多少客户端访问它,都不会导致资源耗尽和停机。

缺点:当大量客户端进入时,随着并发访问次数的增加,伪异步IO通信可能会出现线程池阻塞问题。

伪异步IO的通信模型如下:

当有N个新客户端访问时,伪异步IO通信将客户端的套接字封装到任务中并将其传递给后端线程池。 JDK线程池负责维护消息队列和N个活动线程。它与BIO通信模型的最大区别在于,伪异步IO通信的服务器不再为每个客户端创建单独的线程。它是一个统一处理所有客户端访问请求的线程池。当存在大量客户端访问时,并发量不断增加,并且将存在线程池阻塞问题。

(3)NIO沟通

缓冲区:这是一个包含一些要写入或读取的数据的对象。向NIO添加Buffer对象反映了新库与原始IO之间的重要区别。在面向流的IO中,数据可以直接写入或直接读入Strem对象。在NIO中,所有数据都由缓冲区处理。读取数据时,直接读取缓冲区中的数据,写入数据时,将其直接写入缓冲区。无论何时在NIO中处理数据,它都通过缓冲区运行。

通道通道:通过通道通道读取和写入网络数据。通道和流之间的区别在于通道是双向的,并且流仅在一个方向上移动。一个流必须是InputStream或OutputStream的子类,并且该通道可用于读写或两者。

多路复用器选择器:选择器提供选择已准备好的任务的功能。通过连续轮询其上的通道,在通道上发生读或写事件。通道处于就绪状态,将由选择器选择。轮询,然后获取Channel的集合以用于后续IO操作。

NIO通信没有最大连接数限制,可以访问数千个客户端。

(4)AIO沟通

AIO通信:它是一个连接注册读写事件和回调函数,读写方法是异步的,它是主动通知程序。 AIO异步通信提供了两种获取操作结果的方法:第一种方法是通过Future类java.util.concurrent表示异步操作的结果;第二种方法是在执行异步操作时传递java.nio.channels.CompletionHandler接口的实现类将回调作为操作完成。 NIO的异步套接字回调是一个真正的异步非阻塞IO,对应于Unix网络编程中的事件驱动IO。它不需要通过多路复用器轮询注册的通道来实现异步读写。从而简化了NIO的编程模型。

BIO,伪异步IO,NIO和AIO之间的区别如下:

注意:客户端数量的比率是客户端数量与服务器上IO线程数量的比率。

4.WebSocket

(1)什么是WebSocket?

WebSocket是H5协议规范。可以在客户端和服务器之间使用类似握手的机制来建立类似Tcp的连接,这有助于客户端和服务器之间的通信。

它是一种解决客户端和服务器之间实时通信的技术。 WebSocket基本上基于TCP协议。它首先通过Http/Https发送一个特殊的Http请求进行握手。握手后,它会创建数据交换。 TCP链接,之后客户端和服务器使用TCP链接进行实时通信。当WebSocket的客户端和服务器握手时,即在建立通信之后,不再需要先前的http请求参与。

(2)WebSocket的优点:

一个。节省通信开销。在WebServer实现通信之前,使用轮询。 (浏览器每隔一定时间间隔自动发送一个Http请求以从服务器获取响应。)在这种情况下,有必要不断向服务器发送请求,并且HttpRequest处理程序很长,并且包含实际数据可能很小,占用了大量额外带宽和服务器资源。

湾服务器在给定时间主动向客户端发送数据。服务器和客户端随时向对方推送信息,浏览器(客户端)和服务器只需要进行握手。建立连接后,服务器可以主动向客户端传输数据,客户端也可以随意向服务器传输数据。交换数据时携带的标题信息很小。

C。实时通信:WebSocket不仅限于Ajax模式通信。 ajax方法需要浏览器发起请求。 WebSocket技术服务器和客户端可以相互推送信息以进行实时通信。

(3)WebSocket建立连接过程如下:

一个。客户端发起握手请求。

湾服务器响应请求。

C。建立连接。

详细过程:

要建立WebSocket连接,客户端或浏览器首先向服务器发送一个特殊的Http请求(带有一些额外的头信息),升级: websocket,服务器解析附加头信息,生成响应消息,然后响应客户端,然后客户端A链接与服务器建立响应。

(4)WebSocket生命周期:

信息。

1.1。创建WebSocketSession对象:用于指示已建立链接。

1.2,配置对象:包含配置端点的信息。

1.3,一组路径参数,用于打开节点握手,WebSocket端进入堆栈匹配URI。

2,消息事件:主要用于接收WebSocket对话框另一端发送的消息。链接上的消息将以三种形式到达客户端。

2.1,短信:用字符串处理

2.2,二进制消息:用byteBuffer或byte

处理

2.3,pong消息:使用JavaWebSocketAPI中的pong.message接口实例来处理

3.错误事件:WebSocket链接或端点出错时生成。处理堆栈消息时可能发生的各种异常。推送消息可以生成三个异常。

3.1。在WebSocket:SessionException类型中创建链接时发生错误。

3.2。当WebSocket尝试将推送消息解码为开发人员使用的对象时,EncodeException类型。

3.3。 WebSocket端点的其他方法生成的错误,WebSocket实现将记录端点操作期间生成的任何异常。

4,关闭事件:WebSocket链接端点关闭,做一些清理工作,可以由参与连接的任何端点发出。

(5)WebSocket关闭链接:

1.服务器关闭底层TCP链接

2.客户端启动TCPClose

通常应首先由服务器关闭底层TCP。如果发生异常,客户端可以启动TCPClose。

进程:当指示服务器关闭WebSocket链接时,服务器将启动TCPClose操作,客户端应等待服务器的TCPClose。

5.WebSocket用例演示

(1)使用以下结构创建SpringBoot项目:

(2)启动SpringBoot服务,访问:

(3)启动MainApp主程序,然后刷新页面,即可发送数据。

效果图如下:

收集报告投诉