springboot netty websocket
创始人
2025-05-31 13:08:32
0

springboot netty websocket

  • 1.netty介绍
    • 1.1netty定义
    • 1.2netty优点
    • 1.3逻辑图
  • 2.整合
    • 2.1maven依赖
    • 2.2配置类
    • 2.3WebSocketServer
    • 2.4WebSocketFrameHandler

1.netty介绍

1.1netty定义

Netty是 一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。
官网:https://netty.io/wiki/user-guide-for-4.x.html
更多样例
https://github.com/netty/netty/tree/4.1/example/src/main/java/io/netty/example

1.2netty优点

  • API使用简单,学习成本低。
  • 功能强大,内置了多种解码编码器,支持多种协议。
  • 性能高,对比其他主流的NIO框架,Netty的性能最优。
  • 社区活跃,发现BUG会及时修复,迭代版本周期短,不断加入新的功能。
  • Dubbo、Elasticsearch都采用了Netty,质量得到验证。

1.3逻辑图

在这里插入图片描述

BossGroup 和 WorkerGroup:

bossGroup 和 workerGroup 是两个线程池, 它们默认线程数为 CPU 核心数乘以 2 bossGroup
用于接收客户端传过来的请求,接收到请求后将后续操作交由 workerGroup 处理

Selector(选择器):

检测多个通道上是否有事件的发生
TaskQueue
(任务队列):

上面的任务都是在当前的 NioEventLoop ( 反应器 Reactor 线程 ) 中的任务队列中排队执行 ,
在其它线程中也可以调度本线程的 Channel 通道与该线程对应的客户端进行数据读写
Channel:

Channel 是框架自己定义的一个通道接口, Netty 实现的客户端 NIO 套接字通道是 NioSocketChannel
提供的服务器端 NIO 套接字通道是 NioServerSocketChannel
当服务端和客户端建立一个新的连接时, 一个新的 Channel 将被创建,同时它会被自动地分配到它专属的 ChannelPipeline :
ChannelPipeline
是一个拦截流经 Channel 的入站和出站事件的 ChannelHandler 实例链,并定义了用于在该链上传播入站和出站事件流的 API
ChannelHandler:

分为 ChannelInBoundHandler 和 ChannelOutboundHandler 两种 如果一个入站 IO
事件被触发,这个事件会从第一个开始依次通过 ChannelPipeline中的 ChannelInBoundHandler,先添加的先执行。
若是一个出站 I/O 事件,则会从最后一个开始依次通过 ChannelPipeline 中的
ChannelOutboundHandler,后添加的先执行,然后通过调用在 ChannelHandlerContext
中定义的事件传播方法传递给最近的 ChannelHandler。 在 ChannelPipeline 传播事件时,它会测试
ChannelPipeline 中的下一个 ChannelHandler 的类型是否和事件的运动方向相匹配。
如果某个ChannelHandler不能处理则会跳过,并将事件传递到下一个ChannelHandler,直到它找到和该事件所期望的方向相匹配的为止。

2.整合

2.1maven依赖

io.nettynetty-all

2.2配置类

/*** @Author: GZ* @CreateTime: 2023-03-20  11:51* @Description: * @Version: 1.0*/
@Component
public class WebSocketChannelConfig  extends ChannelInitializer {@Resourceprivate  WebSocketFrameHandler webSocketFrameHandler;@Overrideprotected void initChannel(Channel channel) throws Exception {ChannelPipeline pipeline = channel.pipeline();// netty中http协议的编解码pipeline.addLast(new HttpServerCodec());//最大内容长度pipeline.addLast(new HttpObjectAggregator(65536));//压缩pipeline.addLast(new WebSocketServerCompressionHandler());//协议pipeline.addLast(new WebSocketServerProtocolHandler("/ws", null, true));//主要逻辑pipeline.addLast(webSocketFrameHandler);}
}

2.3WebSocketServer

package com.insound.commontest.component;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.WebSocketServerProtocolHandler;
import io.netty.handler.codec.http.websocketx.extensions.compression.WebSocketServerCompressionHandler;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import javax.annotation.PostConstruct;
import javax.annotation.Resource;/*** @Author: GZ* @CreateTime: 2023-03-20  10:45* @Description: WebSocketServer* @Version: 1.0*/
@Component
@Slf4j
public class WebSocketServer {@Autowiredprivate static WebSocketChannelConfig webSocketChannelConfig;@PostConstructprivate void init() {bind(8084);}public static void bind(int port) {//老板线程,用于接受线程EventLoopGroup bossGroup = new NioEventLoopGroup(1);//工人线程,用于处理任务EventLoopGroup workerGroup = new NioEventLoopGroup(1);try {//创建netty启动类ServerBootstrap serverBootstrap = new ServerBootstrap();//设置线程组serverBootstrap.group(bossGroup, workerGroup)//设置通道非阻塞IO.channel(NioServerSocketChannel.class)//设置日志.handler(new LoggingHandler(LogLevel.INFO)).childHandler(webSocketChannelConfig);//服务器异步创建绑定通道ChannelFuture channelFuture = serverBootstrap.bind(port).sync();log.info("-----netty服务器端启动成功-----");//关闭服务器通道channelFuture.channel().closeFuture().sync();} catch (Exception e) {log.error("WebSocketServer is error",e);} finally {//释放线程池资源bossGroup.shutdownGracefully();workerGroup.shutdownGracefully();}}
}

2.4WebSocketFrameHandler

@Component
@Slf4j
public class WebSocketFrameHandler extends SimpleChannelInboundHandler {@Overrideprotected void channelRead0(ChannelHandlerContext channelHandlerContext, TextWebSocketFrame textWebSocketFrame) throws Exception {log.info("接受消息");}@Overridepublic void channelActive(ChannelHandlerContext ctx) throws Exception {log.info("建立连接");}@Overridepublic void channelInactive(ChannelHandlerContext ctx) throws Exception {log.info("断开连接");}
}

相关内容

热门资讯

香港金融管理局对三家银行采取纪... 北京商报讯(记者 孟凡霞 实习记者 周义力)7月22日,香港金融管理局宣布,根据《打击洗钱及恐怖分子...
原创 突... 美国突然变卦了!就在中美贸易谈判进入关键阶段,美国财长贝森特冷不防抛出新要求——打算在协议里硬塞两条...
深圳新晋13家独角兽企业,福田... 7月18日,2025中国(深圳)独角兽企业大会发布《GEI中国独角兽企业研究报告2025》和《深圳市...
汇划1180亿元!“跨境理财通... 7月21日,记者从人民银行广东省分行获悉,“跨境理财通”自2021年启动以来,极大地促进了粤港澳大湾...
秦洪看盘|热门主线波动不改A股... 来源:澎湃新闻 周二A股市场出现了探底回稳的走势。 早盘由于银行股的疲软,主要股指一度翻绿,升势有受...
股票行情快报:美凯龙(6018... 证券之星消息,截至2025年7月22日收盘,美凯龙(601828)报收于3.07元,上涨0.66%,...
原创 煜... 在全球能源格局加速演变、国内“双碳”目标持续深化的大背景下,电力行业正站在变革的前沿。2025年是“...
星环科技拟港交所上市:年亏损额... 近日,科创板上市公司星环科技(688031.SH)发布公告称,为进一步提高公司综合竞争力,更好地利用...
中国启动水电珠峰水利隧道工程!... 2025年7月,中国雅江集团的成立和雅鲁藏布江下游水电工程的开工,标志着世界水电史迎来新的里程碑。 ...
OpenAI CEO:Deep... 【环球网科技综合报道】7月22日消息,据windowscentral报道称,OpenAI 首席执行官...
国家外汇局贾宁:未来外资配置人... 7月22日,国家外汇管理局国际收支司司长贾宁在国新办新闻发布会上表示,未来外资配置人民币资产仍具有较...
并购 | 深度拆解地方国资收购... 一、交易背景 2023年9月20日晚间,上海雅仕投资发展股份有限公司(以下简称“上海雅仕”)公告称...
21日豆二上涨0.19%,最新... 来源:新浪期货 新浪期货 根据交易所数据,截至7月21日收盘主力合约豆二2509,涨跌+0.19%,...
兴证资管国企红利优选混合发起式... AI基金兴证资管国企红利优选混合发起式A(023169)披露2025年二季报,第二季度基金利润112...
专访新辰商业集团联合创始人及C... 在当前商业环境持续变革的背景下,社区商业正逐步成为商业领域的重要发展方向。新辰商业作为这一领域的后起...
与美国斗了整整七年,中国总结出... 与美国斗了整整七年,中方总结出4句话,想看美国是否吸取了教训 国新办日前召开系列主题新闻发布会,商务...
以“诚”破局,利他共生——稻盛... 在中国民营经济迈向高质量发展的关键阶段,企业呼唤更加坚定的精神信仰与先进的经营哲学。6月8日,稻盛和...
詹记桃酥频现日期乱象,有消费者... 近日,有消费者爆料称,其在连锁中式糕点品牌詹记桃酥(下称“詹记”)门店买到了“未来蛋糕”,门店回应称...
李开复:零一万物AI Agen... 李开复入场做AI Agent智能体。 7月22日消息,零一万物创始人兼CEO李开复博士今天上午宣布,...