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相关的依赖:
- 定义处理器(ChannelHandler)
创建一个继承自ChannelInboundHandlerAdapter的类,重写其中的方法以处理WebSocket连接请求、消息接收及发送等事件。例如:
- 配置服务器端Bootstrap
使用ServerBootstrap初始化服务器,设置线程模型并添加处理器到管道中:
在这里,我们为每个新连接添加了多个处理器,包括HTTP编解码器、响应编码器、请求解码器以及WebSocket协议处理器和我们的自定义WebSocket处理器。
- 处理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
文章为作者独立观点不代本网立场,未经允许不得转载。