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("断开连接");}
}

相关内容

热门资讯

“嫣然医院欠租风波”房东方最新... 近日,李亚鹏及其创立的嫣然天使儿童医院陷入“欠租风波”,引发关注。(相关报道:) 今天(1月22日)...
香港邵氏兄弟收购正午阳光!华人... 影视行业或将上演一出“蛇吞象”的资本戏码。 1月21日晚间,邵氏兄弟(00953.HK)公告宣布,拟...
深夜大涨!现货黄金首次站上49... 23日早盘,现货黄金持续拉涨,盘中最高站上4959美元/盎司,截至发稿小幅回落,报4937.090美...
玲珑轮胎终止香港上市 1月23日,山东玲珑轮胎股份有限公司公告披露,决定终止此前筹划的发行H股股票并于香港联交所主板上市的...
英特尔盘后惨跌!Q4业绩超预期... 智通财经获悉,英特尔(INTC.US)股价在公布最新财报后大跌,原因是该公司首席执行官陈立武给出了乏...
商业银行争夺“年终奖” 岁末年初,多家国有大行、股份行及理财子公司已经打响年终奖“吸金”争夺战。 针对年终奖,多家银行打造“...
华安基金管理有限公司 关于华安... 近期,华安基金管理有限公司(以下简称“本公司”)旗下华安国际龙头(DAX)交易型开放式指数证券投资基...
比利时首相达沃斯语出惊人:做一... 欧洲对美国的焦虑和反抗,成为这一届达沃斯论坛不可磨灭的主题,其中比利时首相巴尔特·德韦弗的一句发言可...
广州珠江发展集团股份有限公司2... 本公司董事会及全体董事保证本公告内容不存在任何虚假记载、误导性陈述或者重大遗漏,并对其内容的真实性、...
白色石油价值重估,锂价能否突破... 汇通财经APP讯——2025年碳酸锂市场在供应过剩与价格深跌的动荡中触底,随着模块化储能需求的爆发式...
美国总统特朗普:杰米·戴蒙让我... 美国总统特朗普:杰米·戴蒙让我失去了银行账户。 来源:金融界AI电报
GPU创企曦望一年融资30亿:... 曦望表示,所筹资金将用于下一代推理GPU研发、规模化量产及生态共建。 资料显示,曦望成立于2020...
【网络股指数ETF收涨1.9%... 【网络股指数ETF收涨1.9%,领跑美股行业ETF】周四(1月22日),网络股指数ETF收涨1.91...
佩蒂股份:新西兰品牌上市计划稳... 1月9日,佩蒂股份(300673)在交易所官方互动平台回应投资者提问时表示,公司新西兰主粮工厂目前已...
特朗普起诉美国最大银行 新华社纽约1月22日电(记者刘亚南 徐静)据美国媒体22日报道,美国总统特朗普对美国最大银行摩根大通...
行业调查称英国零售商颓势有所缓... 中新网伦敦1月22日电(记者 欧阳开宇)英国工业联合会(CBI)22日发布的调查显示,本月英国零售商...
和讯投顾周翔:超级主力完成出货... 当前A股市场出现了一些令人关注的现象,确实让不少投资者感到困惑和不安。今天上证50ETF成交创下了1...
业务承压、回款滞后!成都路桥2... 1月22日,成都路桥(002628)披露2025年度业绩预告,预计2025年归母净利润亏损6500万...
美股爆发,黄金直拉!特朗普:将... 1月22日晚间,美股全线走高。消息面上,美国总统特朗普最新表示,正在推进中的格陵兰岛协议将赋予美国“...
原创 楼... 作为一名长期关注中国房地产市场的观察者,我见证了无数家庭在这个市场中的起伏。扎根于地产研究的十八年经...