WebSocket

1,WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议,最初由W3C开发,并于2011年成为标准。浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接,并进行双向数据传输。

2,为了实现推送技术:

  • Ajax 轮询:在特定的的时间间隔,由浏览器向服务器发出HTTP请求,然后由服务器返回数据给浏览器;
  • WebSocket 协议:服务器主动推送;

主动推送

3,WebSocket 的消息格式:WebSocket 的消息格式可以是文本或二进制数据,与 HTTP 请求和响应的消息格式有所不同。并且 WebSocket 消息的传输是在一个已经建立的连接上进行的,因此不需要再进行 HTTP 请求和响应的握手操作。WebSocket 消息格式由两个部分组成:消息头和消息体。消息头包含以下信息:

  • FIN: 表示这是一条完整的消息,一般情况下都是1。
  • RSV1、RSV2、RSV3: 暂时没有使用,一般都是0。
  • Opcode: 表示消息的类型,包括文本消息、二进制消息等。
  • Mask: 表示消息是否加密。
  • Payload length: 表示消息体的长度。
  • Masking key: 仅在消息需要加密时出现,用于对消息进行解密。
  • 消息体就是实际传输的数据,可以是文本或二进制数据。

4,WebSocket 属性:

  • Socket.readyState 0 :表示连接未建立;
  • Socket.readyState 1 : 表示连接已建立,可以进行数据传输;
  • Socket.readyState 2 : 表示连接正在关闭;
  • Socket.readyState 3 :表示连接已经关闭或连接不能打开;
  • Socket.bufferedAmount:已被 send() 放入正在队列中等待传输,但是还没有发出的 UTF-8 文本字节数。

5,WebSocket的生命周期:

  • 建立阶段(Connection Establishment):客户端发送一个 WebSocket 握手请求,服务器响应一个握手响应,然后连接建立。
  • 开放阶段(Connection Open):WebSocket 连接已经建立并开放,客户端和服务器可以在连接上互相发送数据。
  • 关闭阶段(Connection Closing): WebSocket 连接即将被关闭,它可以被客户端或服务器发起。
  • 关闭完成阶段(Connection Closed): WebSocket 连接已经完全关闭,客户端和服务器之间的任何交互都将无效。

6,WebSocket 事件:

  • open:连接建立时触发;
  • message:接收数据时触发;
  • error:错误时触发;
  • close:连接关闭时触发;

7,WebSocket方法:

  • Socket.send():使用连接发送数据;
  • Socket.close():关闭连接;

8,Websocket 使用 ws 或 wss 的统一资源标志符,其中 wss 表示在 TLS 之上的 Websocket,例如:

ws://example.com/wsapi

wss://example.com/secure

9,Websocket端口: 相同的HTTP TCP 端口80。默认情况下,Websocket 协议使用 80 端口,当运行在 TLS 之上时,默认使用 443 端口。

10,Websocket实例:大部分浏览器支持 WebSocket() 接口,如Chrome、Mozilla、Opera 、Safari、Edge。

11,请求格式:

12,服务器回应:

13,附TCP的socket原理图:

详解Netty搭建WebSocket服务:从入门到实战

WebSocket是一种在单个TCP连接上进行全双工通信的协议,允许客户端和服务器之间进行实时、双向的数据传输。Netty作为高性能的异步事件驱动网络应用框架,提供了对WebSocket的支持。本文将详细介绍如何使用Netty搭建一个功能完善的WebSocket服务,并解析关键步骤和技术细节。

首先确保项目中引入了Netty库以及WebSocket相关的依赖:

  1. 定义处理器(ChannelHandler)

创建一个继承自ChannelInboundHandlerAdapter的类,重写其中的方法以处理WebSocket连接请求、消息接收及发送等事件。例如:

  1. 配置服务器端Bootstrap

使用ServerBootstrap初始化服务器,设置线程模型并添加处理器到管道中:

在这里,我们为每个新连接添加了多个处理器,包括HTTP编解码器、响应编码器、请求解码器以及WebSocket协议处理器和我们的自定义WebSocket处理器。

  1. 处理WebSocket消息

在自定义的WebSocket处理器中,实现消息接收和发送逻辑。WebSocketFrame类型的消息需要根据其实际类型(文本或二进制)进行处理:

客户端可以通过WebSocket API连接到Netty服务器,然后发送和接收数据。

JavaScript示例:

上述代码展示了如何在浏览器环境中使用原生WebSocket API与Netty WebSocket服务进行交互,包括了建立连接、发送消息、接收消息以及处理连接状态变化等基本操作。

  • 心跳检测

Netty可以配置IdleStateHandler来实现心跳机制,确保长连接的有效性。当达到预设的空闲时间后,服务器可以向客户端发送Ping帧,客户端回应Pong帧以证明连接依然活跃。

  • 多路复用

Netty支持在一个TCP连接上同时处理多个WebSocket会话,这对于降低服务器资源消耗、提高并发性能具有重要意义。

  • 自定义协议扩展

在WebSocket协议的基础上,可以进一步定制自己的应用层协议,通过在WebSocket Frame中添加额外的数据字段或者构建更复杂的帧结构。

  • 流量控制与拥塞控制

可以利用Netty提供的工具和API对入站和出站流量进行管理和控制,例如限制最大帧大小、设置缓冲区大小等。

总结起来,通过Netty框架搭建WebSocket服务不仅可以简化开发流程,而且能充分利用其高性能异步处理能力,为构建实时通信、消息推送等功能提供坚实的基础支撑。通过上述步骤,开发者可以快速实现稳定、高效的WebSocket服务,并根据业务需求对其进行深度定制和优化。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。