netty学习:基于WebSocket协议开发服务端及客户端,实现双向通信

Netty框架介绍并编写WebSocket服务端与客户端 阅读详情

学习过程中有参考Redisson和RocketMq对于netty的使用

一、服务端

1、启动类

    @Autowired
    private WebsocketProperties properties;
    @Autowired
    private WebSocketChannelInitializer webSocketChannelInitializer;

    NioEventLoopGroup bossGroup = new NioEventLoopGroup();
    NioEventLoopGroup workerGroup = new NioEventLoopGroup();

    public void start() throws InterruptedException {
        prepareExecutorService();
        ServerBootstrap serverBootstrap = new ServerBootstrap();
        serverBootstrap.group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel.class)
                .option(ChannelOption.SO_BACKLOG, 1024)
                .childOption(ChannelOption.TCP_NODELAY, true)
                .childOption(ChannelOption.SO_KEEPALIVE, true)
                .childHandler(webSocketChannelInitializer);

        Channel channel = serverBootstrap.bind(properties.getPort()).sync().channel();
        log.info("Websocket server run at port: " + properties.getPort());
        channel.closeFuture().sync();
    }

2、实现ChannelInitializer(暂时未考虑ssl)

    @Autowired
    private WebsocketProperties properties;
    @Autowired
    private HttpRequestHandler httpRequestHandler;
    @Autowired
    private TextWebSocketFrameHandler textWebSocketFrameHandler;

    @Override
    protected void initChannel(SocketChannel channel) throws Exception {
        ChannelPipeline pipeline = channel.pipeline();
        SslContext sslContext = configureSslContext();
        if (sslContext != null) {
            pipeline.addLast(sslContext.newHandler(channel.alloc()));
        }
        pipeline
                .addLast(new WebSocketIdleStateHandler())
                .addLast(new HttpServerCodec())
                .addLast(new HttpObjectAggregator(65536))
                .addLast(httpRequestHandler)
                .addLast(PingWebSocketFrameHandler.INSTANCE)
                .addLast(textWebSocketFrameHandler)
                .addLast(CloseWebSocketFrameHandler.INSTANCE);
    }

 配置的空闲检测为读15秒钟,客户端心跳请求

基于Netty实现WebSocket客户端 握手事件是在自定义的Handler中实现的,这里为了方便使用CountDownLatch,使用了匿名内部类SimpleChannelInboundHandler的方式。这里我们不手动进行握手,由Netty通过WebSocketClientProtocolHandler进行握手,但是我们要知道何时握手完成了。测试的时候,我们可以看到,当客户端发送ping的时候,服务端会自动回pong,这个是有Netty实现的服务端自带的心跳机制。】,测试用的WebSocket服务端也是用Netty实现的,参考【 阅读详情

相关推荐

服务端给客户端推送消息用Netty+WS实现

# 前言 曾几何时,不知道大家有没有在项目里遇到过需要服务端给客户端推送消息的需求,是否曾经苦恼过、纠结过,我们知道要想实现这样的需求肯定离不开websocket长连接方式,那么到底是该选原生的websocket还是更加高级的netty框架呢?在此我极力推荐netty,因为一款好的框架一般都是在原生的基础上进行包装成更好、更方便、更实用的东西,很多我们需要自己考虑的问题都基本可以不用去考虑...

KHOST的博客 3100

doris:主键模型的导入更新

doris:主键模型的导入更新

qq_36070104的博客 1923

避坑必看:很详尽的MyBatis返回自增主键实验(包括插入或更新SQL语句insert on duplicate key update的自增主键返回情况)

目录 1. 实验对比维度 (1)单纯的insert和insert on duplicate key update (2)selectKey和useGeneratedKeys (3)@Param和parameterType (4)单个和批量 (5)keyProperty写法 2. 基本概念介绍 (1)插入或更新SQL(简称InsertOrUpdate) (2)selectKey和u...

花郎徒结的博客 3万+

doris:主键模型

doris:主键模型

qq_36070104的博客 2449

插入数据时遇到主键重复问题怎么办?——insert into数据库技巧 (insert into主键重复数据库)

在使用数据库时,主键的作用非常重要,它可以确保数据的唯一性,避免重复插入数据。针对这种情况,我们可以采取忽略重复行、更新重复行、指定插入某些数据等处理方式,有效避免主键重复的问题。另外,在设计数据库表时,应该合理设计主键,并为需要唯一性约束的字段添加唯一索引,以及将主键设置成自增长,这样可以有效地避免主键重复的问题。但是在插入数据的过程中,有时候会遇到主键重复的问题,当这种情况发生时,该怎么处理呢?当我们执行插入数据的操作时,如果插入的数据的主键已经在表中存在,就会出现主键重复的情况。

0 4350

大数据量联合主键的插入更新解决方案

数据量大了之后想对一张表的数据进行插入/更新就会非常慢!目前环境是一张主表数据量在一亿的样子,之前做插入更新处理是用的KETTLE抽取工具,然而这张表是四个字段的联合主键,这样判断起来效率就会非常低,现在跑任务直接会卡死不动。网上找了一些类似的解决方案

ShiningRunner的博客 7006

整合StarRocks主键表全部知识点

总结starrocks主键表全部知识点

qq_18218071的博客 3272

Gorm Save更新踩坑记录|Gorm Save主键冲突|Duplicate entry ‘xxxx‘ for key ‘PRIMARY

在我最近使用Gorm进行字段更新的过程中,我遇到了一个问题。当我尝试更新status字段时,即使该字段的值没有发生变化,Gorm还是提示我“Duplicate entry 'xxxx' for key 'PRIMARY'”。

了迹奇有没 5559

Python 把字典列表里的数据插入mysq 如果主键重复自动执行update更新操作

在scrapy框架爬虫的时候,需要把数据写入mysql,直接可以把item字典插入mysql数据库 data = dict(item) keys = ','.join(data.keys()) values = ','.join(['%s'] * len(data)) sql = "insert into %s(%s) values(%s)" % ('数据库表名称', keys, values) # 指定参数,并执行sql添加

1038

StarRocks表类型差异解析:为何主键表能成功执行DELETE WHERE而更新表不行?

本文深入解析了StarRocks中主键表与更新表在执行DELETE WHERE操作时的核心差异。更新表因采用‘读时合并’机制,WHERE条件严格受限,常导致‘Right expr of binary predicate should be value’报错;而主键表基于‘写时合并’与主键索引,支持复杂的删除条件。文章通过实战案例对比了两者的设计哲学与适用场景,并提供了选型建议。

weixin_29214559的博客 902

StarRocks 主键(Primary Key)深度解析

StarRocks 是一款高性能分析型数据库,专为海量数据的实时分析而设计。作为新一代湖仓(Lakehouse)加速引擎,StarRocks 融合了 MPP 架构和列式存储引擎的优势,能够支持亿级数据秒级查询响应。核心特性全面的数据模型:支持明细模型、主键模型和聚合模型,满足多样化业务场景实时数据分析:提供高效的数据导入与更新能力,支持实时数据处理分布式架构:采用无共享(Shared-Nothing)架构,支持水平扩展向量化执行引擎:通过 SIMD 指令集优化,实现高效计算智能查询优化。

Mirrorship的博客 1571

doris:主键模型的更新并发控制

doris:主键模型的更新并发控制

qq_36070104的博客 1573

MySQL bigint自增主键竟然也会出现主键冲突

MySQL常用数据类型 整数类型 实数类型 字符类型 日期类型 整数类型 TINYINT SMALLINT MEDIUMINT INT BIGINT 占用空间 占用字节 有符号位表示范围 无符号位表示范围 TINYINT 1字节 -128~127 0~255 SMALLINT 2字节 -32768~32767 0~65535 MEDIUMINT 3字节 -8388608~8388607 0~16777215 INT 4字节 -2147483648~2147483647

m0_46503776的博客 2345

mysql中主键索引和联合索引的原理解析

联合索引:将数据库表中多个字段组成一个索引。bcd联合索引;bcd三个字段进行排序复合索引,也叫联合索引,用户可以在多个列上建立索引,这种索引叫做复合索引。当我们创建一个组合索引的时候,如(k1,k2,k3),相当于创建了(k1)、(k1,k2)和(k1,k2,k3)三个索引,这就是最左匹配原则。查询的字段正好在联合索引字段里面,不需要回表(不需要回表了,直接从联合索引字段中将该字段取出来)同样的也符合联合索引,也不需要回表,因为a字段(主键)在联合索引中。

python全栈 7062

数据仓库 数据库 建模:关于业务主键和逻辑主键的取舍 - [s00n原作]

数据仓库 数据库 建模:关于业务主键和逻辑主键的取舍                            by s00n(Jasea@sina.com)       关于这个问题网上已经有很多的讨论,现在综合这些讨论在加上自己众多建模及数据仓库工作中的经验给出以下分析及取舍建议,供各位同行参考:一、业务的东西,是每一个做软件的最薄弱的,并且是最有可能受到客户影响的,也是最会引起问题的。    比

s00n的桃花园 2902

Aitoearn内容营销的最佳开源 AI 代理,创建 · 发布 · 互动 · 副业一站式平台,支持渠道:抖音、小红书(红点)、微信通道、快手、哔哩哔哩、微信公众号、抖音等等

Aitoearn内容营销的最佳开源 AI 代理,创建 · 发布 · 互动 · 副业一站式平台,支持渠道:抖音、小红书(红点)、微信通道、快手、哔哩哔哩、微信公众号、抖音等等

struggle2025的博客 1749

使用广播星历进行 GPS 卫星位置的计算

目录1.计算卫星运动的平均角速度 n2.计算观测瞬间卫星的近地点角3.计算偏近点角4.计算真近点角 f5.计算升交角距 6.计算摄动改正项7.进行摄动改正 8.计算卫星在轨道面坐标系中的位置9.计算观测瞬间升交点的经度 L10.计算卫星在瞬时地球坐标系中的位置11.计算卫星在协议地球坐标系中的位置使用广播星历进行GPS卫星位置的计算的详细步骤如下:关于在广播星历中各参数的分布情况可以参考下图:首先根据广播星历中给出的参数 计算参考时刻(TOE) 的平均角速度 式中,GM为万有引力常数 G 与地球总质量

qq_43381998的博客 5567

SDI-12协议与STM32 进行uart通信

其中DIR_OUT_SDI是一个IO引脚,控制UART_TX_SDI是否使能,U10是三态门IC,即拉低DIR_OUT_SDI使能stm32输出,拉高DIR_OUT_SDI失能输出,串口配置8位数据位,偶校验,1位停止位,1200波特率。示波器测试得到传感器的应答信号如下:第一个是唤醒信号,拉高电平13毫秒,之后保持20毫秒低电平,第二个数据帧是激活信号,即ascii码: "0!",第三个是传感器的应答信号:"0\r\n"

weixin_42186805的博客 4401

NX二次开发PK获取对象类型

PK_ENTITY_ask_class(),获取对象类型建议用这个函数,比较通用,包含所有对象类型,可以替代UF_MODL_ask_edge_type(),UF_MODL_ask_body_type(),UF_MODL_ask_face_type()等函数。

qq_39541524的博客 827

华为OD机试 - 进制转换 - 二进制(Python/JS/C/C++ 2024 B卷 100分)

华为OD机试 2024E卷题库疯狂收录中,刷题。

学Java,找哪吒 916

37、免驱动USB双目同步测距3D活体深度检测和RV1126结合V4L开发USB摄像头使用

基本思想:需要使用双目摄像头在rv1126上进行活体检测,然后将画面实时返回到桌面上,记录一下。第二步:刷机rv1126开发板系统和ssh远程连接,见参考目录。第一步:购买可见光的红外摄像头,见参考连接,在PC端测试可用。

sxj731533730 2620

YOLO11多个点组合创新:GC10-DET缺陷检测 | DCNv4结合SPPF+11Detect创新性结合

DCNv4结合SPPF+11Detect创新性结合,原始mAP50为0.633 提升至0.651

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1290

树莓派 5 AI 套件(Hailo)示例

该用户自定义类作为输入传递给回调函数,该函数在管道输出上运行。它用于主程序与回调函数之间的通信。它对 hailo_rpi_common::app_callback_class 进行了扩展,并可根据应用程序的具体情况定制附加变量和方法。

机器人控制与仿真应用 4115

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

上一篇: MySQL实现排序开窗函数
psy_ing
博客等级 码龄11年 0粉丝 2原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值