当前位置: 首页 > 网络应用技术

Netty系列:使用Netty构建Websocket服务器

时间:2023-03-08 17:15:00 网络应用技术

  WebSocket是一个出色的协议,它基于TCP,与HTTP网络协议兼容。通过WebSocket,我们可以实现客户和服务器方面的即时消息传递,从而消除了由多个客户端造成的性能损失。

  由于Websocket如此出色,因此如何在Netty中使用Websocket?

  尽管WebSocket是一个与HTTP协议完全不同的单独协议,但它仍然放在Netty中的HTTP软件包中。LET对Netty中的各种协议的支持。如果您想支持此协议,则是解码器和编码编码器必须需要解码器来编码协议。将传输数据从字节布夫转换为协议类型,或将协议类型转换为bytebuf。

  这是Netty工作的核心原则,也是随后的自定义Net扩展的基础。

  那么Websocket是什么?

  作为协议,Websocket自然不会出来稀薄的空气。通过持续开发,它已经达到了当今的Websocket协议。我们不会深入介绍Websocket的开发历史。LET首次查看Netty提供的各种Websockets的版本。

  在WebSocketversion类中,我们可以看到:

  WebSocketversion是一种枚举类型,它定义了Websocket的4个版本。除了未知之外,我们还可以看到Websocket的版本具有0、7、8和13。

  我们知道Websocket的消息通过帧传递,因为不同Websocket的版本会影响帧的不同格式。因此,我们需要不同的FramedeCoder和FrameEncoder在WebsocketFrame和Bytebuf之间进行转换。

  由于WebSocket有四个版本,因此有4个版本的解码器和编码器:

  至于每个版本之间的框架之间的差异,我们不会在这里谈论它。有兴趣的朋友可以关注我的关注文章。

  熟悉Netty的朋友应该知道它是否是编码器和解码器,他们在频道中起作用。

  Netty提供了一个WebSocketServerHandShaker类来使用编码器和解码器。NETTY提供了出厂类WebSocketServerhandhandshakerFactory。根据客户端请求Header的Websocket版本,它返回不同的WebSocketServerHandshaker。

  同样,我们可以看到Netty还定义了4个不同的WebSocketServerHandshaker。

  Handleshake方法在WebSocketServerHandshaker中定义。

  在每个WebSocketServerHandshaker的特定实现中,定义了两个NewWebockocketCoder和NewWebSocketDecoder。

  所有Ecode和Decode均在WebSocketFrame和Bytebuf.WebSocketFrame中转换为DefaultByteBufHolder的继承,表明它是一个Bytebuf Container.in,除了保存BYTEBUF,它还具有两个附加属性,这些属性是FinalFragment和RSV。

  FinalFragment表示,该框架是否是最后一个帧。对于大量数据量的消息,该消息将分为不同的框架,这特别有用。

  让我们看一下Websocket协议消息的格式:

  RSV表示消息中的扩展字段,即RSV1,RSV2和RSV3。

  此外,Bytebuf的一些基本操作。

  WebSocketFrame是一个抽象类。其特定的实施类具有以下内容:

  BinaryWebSocketFrame和TextWebSocketFrame已熟悉,它们代表了两种消息传输方式。

  CloseWebSocketFrame是一个关闭连接的框架。ContinuationWebsocketFrame代表消息中框架的表示多。

  pingwebsocketFrame和PongwebSocketFrame是两个特殊框架。它们主要用于服务器和客户端检测。

  这些帧对应于Websocket的消息类型的类型,该消息类型了解Websocket的消息类型的类型,并且了解这些帧类非常有帮助。

  说到Websocket的许多原则和实施类别,下一个是实际战斗。

  在此示例中,我们使用Netty创建WebSocket服务器,然后使用浏览器客户端访问服务器。

  创建WebSocket服务器和普通Netty服务器的过程并没有什么不同。就在ChannelPipeline中,您需要添加一个自定义的WebSockEcketServerVerler:

  这个WebSocketServerHandler需要做什么?

  它需要同时处理普通的HTTP请求和Websocket请求。

  这两个请求可以根据接收的味精类型的差异来判断:

  在客户端连接到Websocket之前,您需要借用当前的频道以打开handleshake:

  获得握手后,我们可以处理后续的WebSocketFrame:

  在这里,我们只是一个机械返回消息。您可以根据不同的业务逻辑分析消息。

  在服务器端,如何连接客户端?构造WebSocket对象,然后处理各种回调非常简单:

  以上是使用Netty构建WebSocket服务器的完整过程。本文中的服务器还可以同时处理普通的HTTP请求和Websocket请求,但这是否有些复杂。有一个简单的方法吗?请继续关注。

  本文的示例可以参考:Learn-netty4

  最受欢迎的解释,最深的干货,最简单的教程,您不知道的许多技巧正在等待您发现!

  欢迎注意我的公共帐户:“程序的事情”,了解技术并更好地了解您!