当前位置: 首页 > news >正文

记一次netty客户端的开发

背景

近日要开发一个tcp客户端程序去对接上游厂商的数据源,决定使用netty去处理,由于很久没有开发过netty了,顺便学习记录下

netty搭建

考虑到我们需要多个client去对接server服务,所以我们定义一个公共的AbstractNettyClient父类,定义一些公共的方法,比如,连接,重试等。以达到代码复用
我这里采用的是三层结构的设计,因为对接的上游数据厂商的不止一家,每家厂商会存在一定的定制化逻辑,所以在此进行封装

  1. 公共的nettyClient父类,所有netty 子类继承
  2. 具体上游厂商的父类,实现厂商对接的一些公共处理
  3. 真正实现的子类,有多少个需要对接的,就实现多少
    在这里插入图片描述

需要哪些公共方法

对于最上层的netty,我们应该定义有哪些全局的公共方法,这里给出几个通用示例

public void start(){// 启动操作
}public void stop(){// 停止操作
}public void restart(){// 重启操作
}

需要哪些Handler?

了解过netty基础的都知道,netty中有inbound和outbound两个出入站的链路处理器供我们处理接受与发送的消息,那么作为全局公共的父类,自然要提供给子类可扩展的handler自选,同时也要维护全局公共的handler,那么这里定义一个公共模板的handler获取方法

    public ChannelInitializer getChannelHandler(AbstractNettyConnector connector) {return new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel ch) throws Exception {ChannelPipeline pipeline = ch.pipeline();pipeline.addLast(new ReadTimeoutHandler(15, TimeUnit.SECONDS));pipeline.addLast(new LoggingHandler());addPipeline(pipeline);}};}public void addPipeline(){// 子类覆盖时间该方法
}

通过这样的方式我们在定义公共的handler同时也能支持子类实现自定义的handler处理特定的事件。
下边给出一些常见的通用handler

  1. ReconnectHandler:重连处理,我们在连接服务端,可能由于网络或者其他问题,会导致连接断开,这个时候我们就需要一个handler去处理重连的情况
  2. ReadTimeoutHandler:因为客户端只做读取,所以这边还需要一个超时读取的handler,用于检测服务读取通道的状态,如果超时未读取数据,那么我们可以做一些操作
  3. DecodeHandler:解码器,在处理真正的消息之前我们需要先解码数据
  4. MessageHandler:消息处理器,解析完解码的数据后,我们真正对消息进行处理的地方

我们整个通用链路的handler,大概就如下
在这里插入图片描述

解码器的选择

由于TCP连接中存在粘包黏包的现象,发过来的消息不一定是个完整的包,所以我们在我们自己的解码器之前还需要定一个解码器处理粘包黏包的问题,对于我自己这边使用的是,定长的解码器
new LengthFieldBasedFrameDecoder(ByteOrder.LITTLE_ENDIAN, 1500, 0, 2, -2, 0, true)
对于该解码器构造参数的解析

  1. 大端和小端模式的选择,这个需要具体询问上游的消息格式
  2. 定长长度
  3. lengthFieldOffset:表示这个包长度的字段,是从第几个字节开始读
  4. lengthFieldLength:长度字段所占用的字节数
  5. lengthAdjustment:用来修正长度字段,比如说你的长度读出来的字节数,并不包含自己,那么在该值里 你就得填这个长度字段的长度

举例:假设现在有个2个字节的长度字段,读出来的值是152,这个值是数据包的长度不包含长度字段,那么lengthAdjustment就应该填-2,减去长度字段 得到真正的数据长度

连接监听器

在启动netty客户端时,可能会产生连接失败等情况,这个时候我们可以在启动处增加一个连接监听器,用来监控启动情况,这个不同于ReconnectHandler,那个是用于处理连接建立和断开时的重连器

ChannelFuture connect = bootstrap.connect(serverAddress, serverPort);
connect.addListener(new ConnectListener(this));public class ConnectListener implements ChannelFutureListener {@Overridepublic void operationComplete(ChannelFuture future) throws Exception {if (!future.isSuccess()) {Throwable cause = future.cause();if (cause instanceof ConnectTimeoutException) {// do something} else {log.error("连接异常", cause);}future.channel().close();}}

相关文章:

记一次netty客户端的开发

背景 近日要开发一个tcp客户端程序去对接上游厂商的数据源&#xff0c;决定使用netty去处理&#xff0c;由于很久没有开发过netty了&#xff0c;顺便学习记录下 netty搭建 考虑到我们需要多个client去对接server服务&#xff0c;所以我们定义一个公共的AbstractNettyClient父…...

策略模式结合Spring使用

1.抽象策略 /*** 支付方式策略* author Linging* version 1.0.0* since 1.0*/ public interface PayStrategy {void pay(BigDecimal money);}2.具体策略 /*** 支付宝* author Linging* version 1.0.0* since 1.0*/ Component("aliPayStrategy") public class AliPa…...

基于 RNNs 对 IMDB 电影评论进行情感分类

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…...

Midjourney绘画参数设置详解

在数字艺术和设计领域&#xff0c;Midjourney是一款强大的绘画工具&#xff0c;它允许艺术家和设计师以数字方式创作出精美的图像。为了充分发挥Midjourney的潜力&#xff0c;正确设置其绘画参数至关重要。本文将深入探讨Midjourney的绘画参数设置&#xff0c;帮助用户更好地掌…...

计算机毕业设计 | springboot养老院管理系统 老人社区管理(附源码)

1&#xff0c;绪论 1.1 背景调研 养老院是集医疗、护理、康复、膳食、社工等服务服务于一体的综合行养老院&#xff0c;经过我们前期的调查&#xff0c;院方大部分工作采用手工操作方式,会带来工作效率过低&#xff0c;运营成本过大的问题。 院方可用合理的较少投入取得更好…...

事务与并发控制

事务&#xff08;Transaction0&#xff09;&#xff1a;要么全做&#xff0c;要么全不做&#xff1b; 事务ACID&#xff1a;原子性Atomicity&#xff1b;一致性Consistency&#xff1b;隔离性Isolation&#xff1b;持久性Durability&#xff1b; 并发操作问题&#xff1a; 1.…...

spring boot 中的异步@Async

spring boot 开启异步调用 1、启动类上添加EnableAsync注解&#xff0c;表示启动异步 2、在具体实现异步的方法上添加Async注解 package com.example.demo;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootAppli…...

【C++/STL】list(常见接口、模拟实现、反向迭代器)

&#x1f308;个人主页&#xff1a;秦jh_-CSDN博客&#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12575764.html?spm1001.2014.3001.5482 目录 前言 list的常见接口 对迭代器的封装 节点 重载-> const迭代器 list与vector的对比 反向迭代…...

wms中对屏幕进行修改wm size设置屏幕宽高原理剖析

背景&#xff1a; 上面是正常屏幕1440x2960的屏幕大小&#xff0c;如果对display进行相关的修改&#xff0c;可以使用如下命令&#xff1a; adb shell wm size 1080x1920 得出如下的画面 明显看到差异就是屏幕上下有黑边了&#xff0c;那么下面就来调研这个wm size是怎么做的…...

java面试题及答案2024,java2024最新面试题及答案(之一)

发现网上很多Java面试题都没有答案&#xff0c;所以花了很长时间搜集整理出来了这套Java面试题大全&#xff0c;希望对大家有帮助哈~ 本套Java面试题大全&#xff0c;全的不能再全&#xff0c;哈哈~ 一、Java 基础 1. JDK 和 JRE 有什么区别&#xff1f; JDK&#xff1a;Ja…...

Go Modules 使用

文章参考https://blog.csdn.net/wohu1104/article/details/110505489 不使用Go Modules&#xff0c;所有的依赖包都是存放在 GOPATH /pkg下&#xff0c;没有版本控制。如果 package 没有做到完全的向前兼容&#xff0c;会导致多个项目无法运行(包版本需求不同)。 于是推出了g…...

结账和反结账

结账与反结账功能在财务软件和会计系统中扮演着重要的角色&#xff0c;以下是关于这两个功能的详细解释&#xff1a; 一、结账功能 结账功能是计算和结转各个会计科目本期发生额和期末余额的过程&#xff0c;同时标志着一定时期内财务活动的结束和财务数据的固化。结账功能的…...

k8s怎么监听资源的变更

监听k8s所有的 Deployment 资源 package mainimport ("context""fmt"v1 "k8s.io/api/apps/v1""k8s.io/apimachinery/pkg/util/json""k8s.io/client-go/informers""k8s.io/client-go/kubernetes""k8s.io/cli…...

Cobaltstrike常用功能

一、快捷工具栏 3、需要创建监听器&#xff0c;才能让靶机上线&#xff0c;连接我们公网服务端上去开启的帧监听端口&#xff0c;做任何操作 都是通过服务器的IP地址去连接靶机&#xff0c;去和靶机进行文件stage的一个传输和交互。这里推荐把cs 放到公网上边&#xff0c;比较…...

UWP与WPF:微软两大UI框架

在微软的开发者生态系统中&#xff0c;UWP(Universal Windows Platform)与WPF(Windows Presentation Foundation)是构建Windows应用的两大明星框架。它们各自携带独特的设计理念和技术特性&#xff0c;服务于不同的开发需求和应用场景。本文将深入探讨这两者之间的异同&#xf…...

【面试】字节码文件是跨平台的吗?

目录 1. 说明 1. 说明 1.字节码文件&#xff08;.class文件&#xff09;是跨平台的。2.字节码文件是Java源代码经过Java编译器&#xff08;javac&#xff09;编译后生成的中间代码文件&#xff0c;这些包含了Java虚拟机&#xff08;JVM&#xff09;指令&#xff0c;而不是特定…...

SpringCloud中注册中心Nacos的下载与使用步骤

1.前言 Nacos&#xff08;Dynamic Naming and Configuration Service&#xff09;是阿里巴巴开源的一款服务发现和配置管理工具。它可以帮助用户自动化地进行服务注册、发现和配置管理&#xff0c;是面向微服务架构的一个重要组成部分。 2.下载 链接&#xff1a;https://pan.b…...

心缘Hub小程序

心缘Hub小程序 文章目录 心缘Hub小程序[TOC](文章目录) 前言飞书文章&#xff1a;[添加链接描述](https://mqdyd6qj756.feishu.cn/wiki/X9qbwrq70i43W0kr5X8cqytSnKb) 一、简介 前言 飞书文章&#xff1a;添加链接描述 一、简介 心缘Hub 不要钱可以匹配 有缘人 、直接拿微信…...

攻防世界maze做法(迷宫题)

首先查壳64bit&#xff0c;直接丢进ida64中进行反编译就完事儿了&#xff0c;然后直接进入main函数打注释分析首先&#xff0c;题目已经提示了这是个迷宫题&#xff0c;我们抓住做迷宫题的两个要点&#xff0c;一找玩法&#xff0c;二找地图&#xff0c; 玩法在主函数中&#…...

PID——调参的步骤

第一步&#xff1a;确定比例增益P 确定比例增益 P 时&#xff0c;首先去掉 PID 的积分项和微分项&#xff0c;一般是令 Ti0、 Td0&#xff08;具体见PID 的参数设定说明&#xff09;&#xff0c;使PID 为纯比例调节。 输入设定为系统允许的最大值60%~70%&#xff0c;由0逐渐加…...

DSI3协议四大模式(CRM/PDCM/BDM/DM)全解析:从汽车胎压监测到电池管理,看它如何工作

DSI3协议四大模式深度解析&#xff1a;从胎压监测到电池管理的实战应用 汽车电子系统正经历着从分布式架构向集中式控制的转型&#xff0c;而DSI3&#xff08;Distributed System Interface 3&#xff09;协议凭借其独特的单线通信设计&#xff0c;正在成为连接各类车载传感器的…...

前端TypeScript吐槽:别再让你的代码变成类型地狱!

前端TypeScript吐槽&#xff1a;别再让你的代码变成类型地狱&#xff01; 毒舌时刻 前端TypeScript就像安全套——用对了能保护你&#xff0c;用错了会让你难受。TypeScript、tsconfig、类型定义... 一堆TypeScript工具让你晕头转向&#xff0c;结果你的代码要么类型定义复杂得…...

如何用DS4Windows让PS手柄在PC游戏世界畅通无阻

如何用DS4Windows让PS手柄在PC游戏世界畅通无阻 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 你是否曾遇到这样的尴尬场景&#xff1a;购买了心仪的PS4或PS5手柄&#xff0c;想在PC上畅…...

Unity WebGL小游戏上抖音,从踩坑到上线:一份避坑指南与性能优化清单

Unity WebGL小游戏上抖音&#xff1a;性能优化与避坑实战手册 当你第一次将Unity WebGL小游戏发布到抖音平台时&#xff0c;可能会遇到各种意想不到的性能瓶颈和兼容性问题。iOS设备上的内存限制、WebGL与Native的性能差距、包体大小控制等挑战&#xff0c;都可能让原本流畅的游…...

计算机毕业设计:Python城市地铁客流与票务可视化分析平台 Django框架 数据分析 可视化 大数据 机器学习 深度学习(建议收藏)✅

博主介绍&#xff1a;✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业✌ > &#x1f345;想要获取完整文章或者源码&#xff0c;或者代做&#xff0c;拉到文章底部即可与…...

PX4开发实战:uORB通信机制详解与代码实操(附避坑指南)

PX4开发实战&#xff1a;uORB通信机制详解与代码实操&#xff08;附避坑指南&#xff09; 在PX4飞控开发中&#xff0c;uORB&#xff08;Micro Object Request Broker&#xff09;作为核心通信机制&#xff0c;承担着模块间数据交换的重要职责。不同于传统嵌入式系统中的全局变…...

如何运用AI技术有效破解企业视觉检测难题

「本文已用流量券推广&#xff0c;欢迎收藏 关注」AI智能体视觉检测系统&#xff08;TVA&#xff09;的核心突破&#xff0c;在于实现了从“被动识别”到“主动决策”的历史性跨越。以汽车零部件制造车间的经典场景为例&#xff0c;螺母焊接点的质检曾是长期困扰各个企业多年的…...

python binascii

## 关于Base64&#xff0c;你可能需要知道这些 在编程的世界里&#xff0c;数据并不总是以我们熟悉的形式存在。有时候&#xff0c;一段文字、一张图片&#xff0c;或者任何其他类型的数据&#xff0c;需要被转换成另一种形式才能在不同的系统中安全传输或存储。Base64就是这样…...

三菱电梯保密资料解析与代码分析

三菱电梯保密资料凌云PRO地址码包括&#xff1a; 1.基本参数地址 2.轿厢部件地址 3.操作箱与外招部件地址 门部件地址 5.楼层部件地址 6.井道信息系统地址 7.操作模式地址 8.附加功能(各台)地址 9.附加功能&#xff08;群控&#xff09;地址 10.响应部件地址 11.声音部件地址 1…...

Boss-Key老板键:一键隐藏窗口的终极隐私保护神器

Boss-Key老板键&#xff1a;一键隐藏窗口的终极隐私保护神器 【免费下载链接】Boss-Key 老板来了&#xff1f;快用Boss-Key老板键一键隐藏静音当前窗口&#xff01;上班摸鱼必备神器 项目地址: https://gitcode.com/gh_mirrors/bo/Boss-Key 你是否曾经历过这样的尴尬时刻…...