springboot 作为客户端接收服务端的 tcp 长连接数据,并实现自定义结束符,解决 粘包 半包 问题

博主最近的项目对接了部分硬件设备,其中有的设备只支持tcp长连接方式传输数据,博主项目系统平台作为客户端发起tcp请求到设备,设备接收到请求后作为服务端保持连接并持续发送数据到系统平台。

1.依赖引入

连接使用了netty,如果项目中没有就先引入:

<dependency><groupId>io.netty</groupId><artifactId>netty-all</artifactId><version>4.1.69.Final</version>
</dependency>

2.创建客户端

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.ByteBufAllocator;
import io.netty.channel.*;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.DelimiterBasedFrameDecoder;
import lombok.extern.slf4j.Slf4j;import java.nio.charset.StandardCharsets;/*** @author GBX* @description tcp长连接客户端* @date 2024/5/29 15:11*/
@Slf4j
public class NettyTcpClient {private final Bootstrap bootstrap;private final EventLoopGroup group;private Channel channel;public NettyTcpClient(String host, int port) {group = new NioEventLoopGroup();bootstrap = new Bootstrap();bootstrap.group(group).channel(NioSocketChannel.class).handler(new ChannelInitializer<SocketChannel>() {@Overridepublic void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();//添加自定义结束规则pipeline.addLast(new DelimiterBasedFrameDecoder(1024, ByteBufAllocator.DEFAULT.buffer().writeBytes("|".getBytes(StandardCharsets.UTF_8))));//添加自定义消息处理器pipeline.addLast(new TcpClientHandler());}});try {channel = bootstrap.connect(host, port).sync().channel();log.info("NettyTcpClient ===》 success");} catch (Exception e) {log.error("NettyTcpClient-发生异常, 信息:", e);}}public void close() {if (channel != null) {channel.close();}group.shutdownGracefully();}public static class TcpClientHandler extends SimpleChannelInboundHandler<ByteBuf> {@Overrideprotected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {//处理接收到的数据System.out.println("Received data ===>: " + msg.toString(StandardCharsets.UTF_8));}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {cause.printStackTrace();ctx.close();}}
}

如上代码中所示,博主使用了 “|” 作为结束符,使用结束符可以有效地解决tcp数据读取的粘包 半包问题。

3.设置配置类以进行自启动

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author GBX* @description tcp长连接配置类* @date 2024/5/29 15:14*/
@Configuration
public class NettyClientConfig {@Bean(destroyMethod = "close")public NettyTcpClient nettyTcpClient() {NettyTcpClient client = new NettyTcpClient("127.0.0.1", 4001);// 启动客户端连接return client;}
}

4.效果测试

启动项目,发现客户端连接远程成功:

远程服务器端,这里使用的是 NetAssist 工具进行模拟(注意:该工具在springboot项目启动前已经提前启动了服务器模式进行了端口监听,可以看到项目启动后进来一个连接):

如上图所示,在8 和 10 后分别由一个结尾符,在工具上发送数据:

在springboot控制台可以看到打印的信息为两条:

工具可以在网盘下载:

链接: https://pan.baidu.com/s/1UccmnEL4VktHTHL7P_2V_g?pwd=6fcw 提取码: 6fcw

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/18905.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CPU占用率很高,相应很慢排查思路

获取线程状态 通过top -c命令可以动态显示进程及其占用资源的排行榜 可以看到&#xff0c;CPU占用率100%的PID是80972&#xff0c;定位到该进程之后&#xff0c;我们再从线程的dump日志中去定位. 使用top -H -p 80972命令查找到该进程中消耗CPU最多的线程&#xff0c;从下面的…

Apose.Words 常用对象详解

系列文章目录 文章目录 系列文章目录前言一、基础对象1. moveToBookmark 前言 本文介绍 Apose.Words 的常用对象的含义及使用方法。 一、基础对象 1. moveToBookmark 将指针移动到书签位置。 moveToBookmark(String bookmarkName, boolean isStart, boolean isAfter) book…

国产可视化爬虫助力AI大模型训练:精准爬取汉语词典

大语言模型&#xff0c;可以生成流畅对话的会话聊天机器人、通畅起草文章的内容生成器。在炫酷技术的背后&#xff0c;数据、算力、算法&#xff0c;被视作生成式AI的三个核心要素。由此可见&#xff0c;高质量的训练数据对于AI算法的准确性至关重要。 如何获得高质量的训练数…

【方法】如何禁止查看压缩包里的内容?

使用压缩文件&#xff0c;可以让文件更方便存储和传输&#xff0c;那对于重要的文件&#xff0c;如何防止随意查看压缩包的内容呢&#xff1f;我们可以试试以下两个方法。 方法1&#xff1a; 最常见的便是给压缩包设置“打开密码”&#xff0c;这样只有通过密码才能查看文件内…

外汇天眼:PayPoint投资100万英镑,深化与Aperidata开放银行合作

PayPoint今日宣布对Aperidata Ltd进行100万英镑的投资&#xff0c;Aperidata是一家创新的消费者和商业信用报告及开放银行平台。 此交易将使PayPoint集团在两家公司之间现有的商业合作基础上更进一步&#xff0c;为包括政府、地方当局、慈善机构和住房协会在内的多个领域的客户…

PaddleOCR2.7+Qt5

章节一&#xff1a;Windows 下的 PIP 安装 官网安装教程地址 按照里面的教程去安装 如果使用cuda版本的还要安装tensorrt&#xff0c;不然后面运行demo程序的程序会报如下错。 下载TensorRT 8版本&#xff0c;tensorrt下载地址 章节二&#xff1a;编译源码 进入官网源码地址 下…

通过AWR结合SQLHC对性能变低的SQL进行分析的过程

ESTDB数据库2020/4/29下午16点附近出现业务卡顿现象。 可以发现问题SQL为(SQL_ID fr0nhywcycrsa)。占问题时段数据库资源消耗的52.69%&#xff0c;通过对此SQL语句的执行效率进行分析&#xff0c;我们发现&#xff1a; 对SQL_ID fr0nhywcycrsa?进行分析&#xff0c;可以发现此…

kubernetes-PV与PVC

一、PV和PVC详解 当前&#xff0c;存储的方式和种类有很多&#xff0c;并且各种存储的参数也需要非常专业的技术人员才能够了解。在Kubernetes集群中&#xff0c;放了方便我们的使用和管理&#xff0c;Kubernetes提出了PV和PVC的概念&#xff0c;这样Kubernetes集群的管理人员就…

Java_认识String类

在 C 语言中已经涉及到字符串了&#xff0c;但是在 C 语言中要表示字符串只能使用字符数组或者字符指针&#xff0c; 可以使用标准库提 供的字符串系列函数完成大部分操作&#xff0c;但是这种将数据和操作数据方法分离开 的方式不符合面相对象的思想&#xff0c;而字符串应用又…

【C++】二维前缀和

1.题目 2.算法思路 和一维前缀和的方法类似&#xff0c;我们需要预处理一个求和矩阵&#xff0c;然后再求和。 下面是模板&#xff1a; 上面两张图片总结出来了两个公式&#xff0c;这是解决此类问题的关键。 3.代码 #include <iostream> using namespace std; #incl…

MSMG Toolkit深度Windows系统镜像文件个性定制!

MSMG Toolkit,这个听起来略显神秘的名字,在DIY电脑爱好者和系统管理员的圈子中却是大名鼎鼎。这是一款免费的系统定制工具,专为Windows操作系统量身定做,旨在帮助用户轻松移除不必要的系统组件、集成更新、添加驱动程序,以及实现无人值守安装等功能,让每一次系统安装都更…

第三方软件测试机构进行验收测试的好处分享,需多少时间和费用?

在软件开发过程中&#xff0c;软件验收测试是不可或缺的一环。那么&#xff0c;什么是软件验收测试呢?为什么建议选择第三方软件测试机构进行验收测试呢? 软件验收测试是指在软件开发完毕后&#xff0c;由测试人员基于软件需求规格说明书和软件设计文档等材料&#xff0c;对…

扩散模型--论文分享篇

定义&#xff1a;输入文本与图像&#xff0c;生成对图像的描述。 所采用的方法&#xff1a;对比学习、基于跨注意力机制的多模态融合 基于扩散模型的方法&#xff1a;主要介绍的扩散的原理 图像生成任务介绍 GAN VAE 扩散模型 基于GAN的图像生成&#xff0c;一个生成器与判别…

【重制版】Unity Meta Quest 一体机开发(一):前期准备,Meta XR SDK导入和环境配置,配置玩家物体

文章目录 &#x1f4d5;教程说明&#x1f4d5;Meta XR SDK 介绍&#x1f4d5;前期准备⭐开启开发者模式⚡在 Meta 官网申请开发者⚡在 Meta Quest 手机 APP 开启开发者 ⭐电脑需要下载的软件⚡Meta Quest Link&#xff08;以前叫做Oculus PC客户端&#xff09;⚡Oculus ADB Dri…

洗地机有哪些牌子比较好?洗地机排行榜十大品牌

随着洗地机市场竞争的日益激烈&#xff0c;市场上涌现出数百个品牌的产品&#xff0c;涵盖了从入门级到高端的各类价位和功能。这种多样化的选择一方面极大地满足了用户的不同需求&#xff0c;但另一方面也让消费者在挑选时面临一定的困扰。在众多种类的洗地机中&#xff0c;如…

MyBatisPlus学习笔记(二)

条件构造器&#xff1a; Wrapper的作用就是来封装我们当前的条件的 删除用的和查询用的一样&#xff1a;QueryWrapper 和 LambdaQueryWrapper MyBatis-Plus分页插件的配置和使用 Ctrl H 查看当前接口或者类的一个继承关系 Ctrl P 分页插件 乐观锁和悲观锁 通用枚举 代码…

LVGL移植到STM32 MCU平台详细经验笔记教程

1、前言 在之前的一篇文章LVGL在VSCode中安装模拟器&#xff0c;已经对LVGL进行了较为详细的介绍&#xff0c;本文将着重讲解如何移植适配LVGL&#xff0c;让这款图形化GUI库在STM32或其它类型的嵌入式MCU设备上运行起来。 LVGL在VScode中安装模拟器运行配置笔记教程_vscode …

利用Dify+Kimi免费使用Kimi的API接口的操作和使用方法

废话不多说&#xff0c;直接开整kimi-free-api项目。 1、kimi-free-api服务安装启动 支持高速流式输出、支持多轮对话、支持联网搜索、支持智能体对话、支持长文档解读、支持图像OCR&#xff0c;零配置部署&#xff0c;多路token支持&#xff0c;自动清理会话痕迹。 与ChatG…

一文了解知识中台:是什么、作用、如何搭建

在当今信息繁杂的时代&#xff0c;知识对于企业来说犹如宝藏般重要&#xff0c;而知识中台就是宝藏山的藏宝图。关于知识中台&#xff0c;你可能会感到好奇&#xff0c;它究竟是什么&#xff0c;有什么作用&#xff0c;又该如何搭建知识中台呢&#xff1f;接下来就让LookLook同…

MATLAB分类与判别模型算法:基于Fisher算法的分类程序【含Matlab源码 MX_002期】

算法思路介绍&#xff1a; 费舍尔线性判别分析&#xff08;Fishers Linear Discriminant Analysis&#xff0c;简称 LDA&#xff09;&#xff0c;用于将两个类别的数据点进行二分类。以下是代码的整体思路&#xff1a; 生成数据&#xff1a; 使用 randn 函数生成随机数&#x…