Netty Websocket
一、WebSocket 协议概述
WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许服务端主动向客户端推送数据,从而实现了实时通信。WebSocket 建立在 HTTP 之上,但与 HTTP 的轮询(Polling)和长轮询(Long Polling)相比,WebSocket 只需一次握手,即可在客户端和服务器之间建立持久的连接,并通过这个连接进行双向数据传输。
二、Netty 框架简介
Netty 是一个高性能、异步事件驱动的网络应用程序框架,支持快速开发可维护的高性能协议服务器和客户端。它基于 Java NIO(非阻塞 I/O)进行封装,提供了更简单易用的 API,并解决了 NIO 编程中常见的复杂性和错误。
三、Netty WebSocket 原理
1. 握手过程
- 客户端发起握手请求:客户端通过 HTTP 请求与服务器建立 WebSocket 连接。这个请求与普通的 HTTP 请求不同,它包含了 WebSocket 特有的升级请求头(如 Upgrade: websocket 和 Connection: Upgrade),以及一个用于验证的 Sec-WebSocket-Key。
- 服务器响应握手请求:服务器接收到客户端的握手请求后,会解析这些请求头,并生成一个响应。响应中包含了 Sec-WebSocket-Accept 头,该头的值是使用 Sec-WebSocket-Key 加上一个固定的字符串(如 “258EAFA5-E914-47DA-95CA-C5AB0DC85B11”),然后通过 SHA-1 加密并 Base64 编码得到的。如果服务器同意升级协议,则响应的状态码为 101(Switching Protocols)。
- 握手成功:一旦服务器发送了包含 Sec-WebSocket-Accept 的响应,并且客户端验证了该响应的正确性,WebSocket 连接就建立起来了。此时,客户端和服务器之间就可以通过 TCP 连接进行双向数据交换了。
2. 数据传输
- 帧(Frame):在 WebSocket 协议中,数据是通过帧来传输的。一个帧可以包含文本数据、二进制数据或控制帧(如关闭帧)。
- ChannelHandler:Netty 使用 ChannelHandler 来处理网络事件和数据。在 WebSocket 应用中,通常会定义一系列的 ChannelHandler 来处理 WebSocket 的特定事件,如握手、消息接收、消息发送等。
- ChannelPipeline:Netty 使用 ChannelPipeline 来管理 ChannelHandler 的链式调用。每个 Handler 都可以对经过的数据或事件进行处理,并决定是否将其传递给链中的下一个 Handler。
3. Netty 的线程模型
- EventLoopGroup:Netty 使用 EventLoopGroup 来管理一组 EventLoop。每个 EventLoop 都是一个不断循环执行任务的线程。在 WebSocket 服务器中,通常会使用两个 EventLoopGroup:一个是用于接收客户端连接的 BossGroup,另一个是用于处理网络读写的 WorkerGroup。
- ChannelPipeline 中的处理流程:当数据到达时,Netty 会将其封装成一个 ChannelHandlerContext 对象,并在 ChannelPipeline 中传递。每个 ChannelHandler 都可以对这个对象进行处理,并可以决定是否将其传递给链中的下一个 Handler。
四、Netty WebSocket 的优势
- 高性能:Netty 基于 NIO 进行封装,提供了非阻塞的 I/O 操作,能够处理大量的并发连接。
- 易用性:Netty 提供了丰富的编码解码器和 Handler,使得开发者可以很容易地实现 WebSocket 的功能。
- 稳定性:Netty 在稳定性和故障恢复方面有出色的表现,能够确保 WebSocket 连接的稳定性和可靠性。
五、Netty WebSocket 的主要组成部分
- ChannelHandler:Netty 使用 ChannelHandler 来处理网络事件,如连接建立、数据读写等。在 WebSocket 应用中,你会定义一系列的 ChannelHandler 来处理 WebSocket 的特定事件,如握手(Handshake)、消息接收、消息发送等。
- ChannelPipeline:Netty 使用 ChannelPipeline 来管理 ChannelHandler 的链式调用。你可以将多个 ChannelHandler 添加到同一个 ChannelPipeline 中,每个 Handler 都可以对经过的数据或事件进行处理,并决定是否将其传递给链中的下一个 Handler。
- WebSocketServerProtocolHandler:这是 Netty 提供的专门用于处理 WebSocket 协议的 Handler。它负责处理 WebSocket 的握手请求,并在握手成功后将后续的 HTTP 帧转换为 WebSocket 帧。
- WebSocketVersion 和 WebSocketSubprotocol:Netty 允许你指定 WebSocket 的版本(如 RFC6455, 也就是 WebSocket 1.0)以及子协议(如自定义的协议标识符)。
六、Netty WebSocket 应用场景
Netty WebSocket 的应用场景非常广泛,主要集中在需要实时、双向通信的 web 应用中。以下是一些典型的应用场景:
1. 即时聊天
- 应用描述:构建实时聊天应用,用户可以实时发送和接收消息,实现低延迟、高效的在线交流。
- 优势:WebSocket 提供了持久连接和双向通信的能力,使得聊天应用能够实时传输消息,减少延迟,提升用户体验。
2. 金融市场实时数据推送
- 应用描述:股票、外汇、期货等金融市场的实时报价、交易提醒等。
- 优势:金融市场数据变化迅速,WebSocket 能够实现服务器主动推送数据给客户端,确保用户能够实时获取最新的市场动态。
3. 新闻与社交媒体实时推送
- 应用描述:新闻、社交媒体的实时推送通知,如微博、今日头条等平台的实时更新。
- 优势:通过 WebSocket,新闻和社交媒体平台可以实时向用户推送最新的内容,提高用户粘性和活跃度。
4. 物联网(IoT)设备监控与远程控制
- 应用描述:智能家居、工业自动化等物联网设备的状态监控与远程控制。
- 优势:物联网设备通常需要实时上传数据并接收控制指令,WebSocket 的实时性和双向通信能力使其成为物联网通信的理想选择。
5. 协作工具
- 应用描述:在线文档编辑、白板绘图、代码协作等需要多方实时同步内容的应用。
- 优势:协作工具需要实时共享和同步数据,WebSocket 能够实现多方之间的实时通信和数据交换,提高协作效率。
6. 游戏
- 应用描述:多人在线游戏中的实时状态同步、玩家交互等。
- 优势:游戏需要低延迟的实时通信来确保玩家之间的同步和交互,WebSocket 的实时性和高效性使其成为游戏开发的常用技术。
7. 实时位置追踪与导航
- 应用描述:实时位置追踪、导航应用中的动态路线更新等。
- 优势:通过 WebSocket,导航应用可以实时接收用户的位置信息,并根据实时交通状况动态更新路线,提高导航的准确性和实用性。
8. 直播互动
- 应用描述:直播平台的实时评论、弹幕、礼物赠送等互动功能。
- 优势:直播需要实时处理大量的用户互动数据,WebSocket 能够实现服务器与客户端之间的实时通信,确保观众能够实时参与直播互动。
9. 数据分析与监控
- 应用描述:实时仪表盘、日志流处理、性能监控系统的实时数据展示与报警。
- 优势:在数据分析和监控领域,实时性非常重要。WebSocket 能够实现数据的实时传输和展示,帮助用户及时发现问题并采取相应的措施。
七、样例
在Netty中实现WebSocket的Demo可以分为服务端和客户端两部分。以下是一个简化的Netty WebSocket Demo示例,展示了如何搭建一个基本的WebSocket服务器和客户端。
maven
确保你已经将Netty的依赖项添加到你的项目中。如果你使用Maven,可以在pom.xml文件中添加以下依赖:
<dependencies><dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.x</version> <!-- 使用你需要的Netty版本 --></dependency>
</dependencies>
Netty WebSocket
WebSocket服务器的代码
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.http.HttpObjectAggregator;
import io.netty.handler.codec.http.HttpServerCodec;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.handler.codec.http.websocketx.WebSocketServerProtocolHandler;
import io.netty.handler.stream.ChunkedWriteHandler;public class WebSocketServer {private int port;public WebSocketServer(int port) {this.port = port;}public void run() throws Exception {EventLoopGroup bossGroup = new NioEventLoopGroup();EventLoopGroup workerGroup = new NioEventLoopGroup();try {ServerBootstrap b = new ServerBootstrap();b.group(bossGroup, workerGroup).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();// HTTP编解码器pipeline.addLast(new HttpServerCodec());// 聚合HTTP消息pipeline.addLast(new HttpObjectAggregator(65536));// 支持大消息的写操作pipeline.addLast(new ChunkedWriteHandler());// WebSocket协议处理pipeline.addLast(new WebSocketServerProtocolHandler("/ws")); // 指定WebSocket的路径为"/ws"// 自定义的WebSocket业务处理pipeline.addLast(new WebSocketServerHandler());}});// 开始监听端口ChannelFuture f = b.bind(port).sync();// 等待服务器套接字关闭f.channel().closeFuture().sync();} finally {// 关闭所有的事件循环以终止所有的线程bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}public static void main(String[] args) throws Exception {int port;if (args.length > 0) {port = Integer.parseInt(args[0]);} else {port = 8080;}new WebSocketServer(port).run();}private static class WebSocketServerHandler extends SimpleChannelInboundHandler<TextWebSocketFrame> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, TextWebSocketFrame msg) throws Exception {// 打印接收到的消息System.out.println("Received message: " + msg.text());// 回显消息ctx.channel().writeAndFlush(new TextWebSocketFrame("Echo: " + msg.text()));}@Overridepublic void handlerAdded(ChannelHandlerContext ctx) throws Exception {// 当handler被添加到ChannelPipeline时调用System.out.println("WebSocket client connected: " + ctx.channel().remoteAddress());}@Overridepublic void handlerRemoved(ChannelHandlerContext ctx) throws Exception {// 当handler从ChannelPipeline中移除时调用System.out.println("WebSocket client disconnected: " + ctx.channel().remoteAddress());}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {// 当异常被抛出时调用cause.printStackTrace();ctx.close();}}
}
相关文章:
Netty Websocket
一、WebSocket 协议概述 WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。它允许服务端主动向客户端推送数据,从而实现了实时通信。WebSocket 建立在 HTTP 之上,但与 HTTP 的轮询(Polling)和长轮询(Long Pol…...
用户注册业务逻辑、接口设计和实现、前端逻辑
一、用户注册业务逻辑分析 二、用户注册接口设计和定义 2.1. 设计接口基本思路 对于接口的设计,我们要根据具体的业务逻辑,设计出适合业务逻辑的接口。设计接口的思路: 分析要实现的业务逻辑: 明确在这个业务中涉及到几个相关子…...
ubuntu搭建harbor私仓
1、环境准备 链接: https://pan.baidu.com/s/1q4XBWPd8WdyEn4l253mpUw 提取码: 7ekx --来自百度网盘超级会员v2的分享 准备一台Ubuntu 机器:192.168.124.165 将上面两个文件考入Ubuntu上面 2、安装harbor 安装Docker Harbor仓库以容器方式运行,需要先安装好docker,参考:…...
深层神经网络示例
维度说明: A[L]、Z[L]:(本层神经元个数、样本数) W[L]:(本层神经元个数、上层神经元个数) b[L]:(本层神经元个数、1) dZ[L]:dA[L] * g’A…...
vue中获取剪切板中的内容
目录 1.说明 2.示例 3.总结 1.说明 在系统中的画面或者时外部文件中进行拷贝处理后,在页面中可以获取剪切板的内容。 2.示例 方式①(直接获取) // 异步函数获取剪切板内容 async function getClipboardContent(ev: any) {try {ev.preventDefault()const clip…...
十五、【机器学习】【监督学习】- 神经网络回归
系列文章目录 第一章 【机器学习】初识机器学习 第二章 【机器学习】【监督学习】- 逻辑回归算法 (Logistic Regression) 第三章 【机器学习】【监督学习】- 支持向量机 (SVM) 第四章【机器学习】【监督学习】- K-近邻算法 (K-NN) 第五章【机器学习】【监督学习】- 决策树…...
知识图谱和 LLM:利用Neo4j驾驭大型语言模型(探索真实用例)
这是关于 Neo4j 的 NaLLM 项目的一篇博客文章。这个项目是为了探索、开发和展示这些 LLM 与 Neo4j 结合的实际用途。 2023 年,ChatGPT 等大型语言模型 (LLM) 因其理解和生成类似人类的文本的能力而风靡全球。它们能够适应不同的对话环境、回答各种主题的问题,甚至模拟创意写…...
目标检测入门:4.目标检测中的一阶段模型和两阶段模型
在前面几章里,都只做了目标检测中的目标定位任务,并未做目标分类任务。目标检测作为计算机视觉领域的核心人物之一,旨在从图像中识别出所有感兴趣的目标,并确定它们的类别和位置。现在目标检测以一阶段模型和两阶段模型为代表的。…...
zookeeper+kafka消息队列群集部署
kafka拓扑架构 zookeeper拓扑架构...
[K8S]一、Flink on K8S
Kubernetes | Apache Flink 先编辑好这5个配置文件,然后再直接执行 kubectl create -f ./ kubectl get all kubectl get nodes kubectl get pods kubectl get pod -o wide kubectl get cm -- 获取所有的configmap 配置文件 kubectl logs pod_name -- 查看…...
系统架构设计师教程 第3章 信息系统基础知识-3.1 信息系统概述
系统架构设计师教程 第3章 信息系统基础知识-3.1 信息系统概述 3.1.1 信息系统的定义3.1.1.1 信息系统3.1.1.2 信息化3.1.2 信息系统的发展3.1.2.1 初始阶段3.1.2.2 传播阶段3.1.2.3 控制阶段3.1.2.4 集成阶段3.1.2.5 数据管理阶段3.1.2.6 成熟阶段3.1.3 信息系统的分类3.…...
Gemma的简单理解;Vertex AI的简单理解,与chatGpt区别
目录 Gemma的简单理解 Vertex AI的简单理解 Gemma Vertex AI Gemma Vertex AI和chatcpt区别 一、定义与功能 二、技术特点 三、应用场景 四、获取与部署 Gemma的简单理解 定义与功能: Gemma是谷歌开源的一款大语言模型,它采用了Gemini架构,并提供了20亿(2B)和7…...
Lua 数组
Lua 数组 Lua 是一种轻量级的编程语言,广泛用于游戏开发、脚本编写和其他应用程序。在 Lua 中,数组是一种非常基础和重要的数据结构。本文将详细介绍 Lua 数组的概念、用法和操作方法。 数组的概念 在 Lua 中,数组实际上是一个列表&#x…...
游戏中的敏感词算法初探
在游戏中起名和聊天需要服务器判断是否含有敏感词,从而拒绝或屏蔽敏感词显示,这里枚举一些常用的算法和实际效果。 1.字符串匹配算法 常用的有KMP,核心就是预处理出next数组,也就是失配信息,时间复杂度在O(mn) 。还有个…...
使用Java和Apache Kafka Streams实现实时流处理应用
使用Java和Apache Kafka Streams实现实时流处理应用 大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿! 引言 实时流处理已经成为现代应用开发中不可或缺的一部分。Apache Kafka Streams是一个强大的库…...
分享 .NET EF6 查询并返回树形结构数据的 2 个思路和具体实现方法
前言 树形结构是一种很常见的数据结构,类似于现实生活中的树的结构,具有根节点、父子关系和层级结构。 所谓根节点,就是整个树的起始节点。 节点则是树中的元素,每个节点可以有零个或多个子节点,节点按照层级排列&a…...
【柴油机故障诊断】基于斑马优化算法ZOA优化柴油机故障诊断附Matlab代码
% 柴油机故障诊断 - 基于斑马优化算法(Zebra Optimization Algorithm,ZOA)优化Transformer模型 % 代码示例仅为演示用途,实际应用中可能需要根据具体情况进行适当修改 % 初始化参数 maxIterations = 100; % 最大迭代次数 populationSize = 50; % 种群大小 % 斑马优化算法…...
C1W4.Assignment.Naive Machine Translation and LSH
理论课:C1W4.Machine Translation and Document Search 文章目录 1. The word embeddings data for English and French words1.1The dataThe subset of dataLoad two dictionaries 1.2 Generate embedding and transform matricesExercise 1: Translating English…...
智能听诊器:宠物健康监测的革新者
宠物健康护理领域迎来了一项激动人心的技术革新——智能听诊器。这款创新设备以其卓越的精确度和用户友好的操作,为宠物主人提供了一种全新的健康监测方法。 使用智能听诊器时,只需将其放置在宠物身上,它便能立即捕捉到宠物胸腔的微小振动。…...
001、Mac系统上Stable Diffusion WebUI环境搭建
一、目标 如标题所述,在苹果电脑(Mac)上搭建一套Stable Diffusion本地服务,以实现本地AI生图目的。 二、安装步骤 1、准备源码【等价于准备软件】 # 安装一系列工具库,包括cmake,protobuf,rust,python3.10,git,wge…...
wordpress后台更新后 前端没变化的解决方法
使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案
目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后,迭代器会失效,因为顺序迭代器在内存中是连续存储的,元素删除后,后续元素会前移。 但一些场景中,我们又需要在执行删除操作…...
人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent
安全大模型训练计划:基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标:为安全大模型创建高质量、去偏、符合伦理的训练数据集,涵盖安全相关任务(如有害内容检测、隐私保护、道德推理等)。 1.1 数据收集 描…...
Windows电脑能装鸿蒙吗_Windows电脑体验鸿蒙电脑操作系统教程
鸿蒙电脑版操作系统来了,很多小伙伴想体验鸿蒙电脑版操作系统,可惜,鸿蒙系统并不支持你正在使用的传统的电脑来安装。不过可以通过可以使用华为官方提供的虚拟机,来体验大家心心念念的鸿蒙系统啦!注意:虚拟…...
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础,但这一子系统结构复杂,常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题,需要一套工具化、…...
