Netty_04_消息协议设计与实战(实践类)

news2024/9/23 16:23:54

文章目录

  • 一、前言
  • 二、整体运行:先启动服务端,然后启动客户端,发送三条消息
  • 三、客户端和服务端
    • 3.1 客户端(重要)
    • 3.2 服务端(重要)
    • 3.3 编码和解码(了解即可)
  • 四、尾声

一、前言

源码下载:https://www.syjshare.com/res/XEE10LTG

二、整体运行:先启动服务端,然后启动客户端,发送三条消息

先启动server
在这里插入图片描述

启动客户端,发送三条消息
在这里插入图片描述

对于三条消息时,都是client发送,server接收,而且是 channel. 发送的,不是 outBound 发送的,所以 clientHandler 和 serverHandler 都是继承 inBound ,只有 channelRead 方法,用来接收消息

服务端日志
在这里插入图片描述

服务收到的消息 reqType 是 0 ,表示 request 请求

客户端日志
在这里插入图片描述

步骤1:启动服务端
步骤2:启动客户端,向服务端发送三条消息
步骤3:服务端的ServerHandler channelRead方法收到消息,并立马在 channelRead 方法里面,向客户端发送一条 reqType 是 1 ,表示 Resp 消息,收到三条来自客户端的消息,就向客户端发送三条响应
步骤4:客户端的ClientHandler channelRead方法收到来自服务端的三条响应,直接在自己的console打印了出来

无论是服务端还是客户端,都是 pipeline.addLast 加上了 MessageRecordDecode 和 MessageRecordEncode 两个类,

客户端:MessageRecordEncode

三、客户端和服务端

3.1 客户端(重要)

客户端:

步骤1:拼装MessageRecord对象

步骤2:pipeline中addLast添加了 MessageRecordEncode,会接受即将发送的 MessageRecord 对象,消息头直接 ByteBuf out 发送出去,消息体序列化为byte[]数组(此处使用Java IO ByteArrayOutputStream流),然后 ByteBuf out 发送出去

步骤3:收到服务端的响应,因为 pipeline 中 addLast 添加了 MessageRecordDecode ,会使用 ByteBuf in 接受收到的 byte[] 数组流,然后在 decode 函数中,拼装成 MessageRecord 对象,对象头就直接取出来就好,对象体需要通过 Java IO ByteArrayInputStream 读进来,反序列化为对象

步骤4:client 收到了 decode 反序列的对象:clientHandler仅仅是继承ChannelInboundHandlerAdapter接收消息,inbound,在 console 打印一下

具体如下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

最后看一下日志:

步骤1:拼装 MessageRecord 没有日志
步骤2:编码有一个日志 log.info("==========开始进行消息编码==================");
步骤3:解码有一个日志 log.info("反序列化出来的结果:"+record);
步骤4:打印消息有一个日志 log.info("ent Receive Message:"+record);

在这里插入图片描述

在这里插入图片描述

最后回顾一下 client pipeline addLast 四个handler
在这里插入图片描述

header 直接 getXxx setXxx ,body 需要ByteArrayInputStream读进来,反序列化为对象,ByteArrayOutputStream写出去,序列化为byte[]
ByteArrayOutputStream 写出去,对象序列化为byte[],ByteArrayInputStream 读进来,byte[]反序列化为对象

3.2 服务端(重要)

服务端:
步骤1:收到消息,MessageRecordDecode 类起作用,byte[]数组反序列化为对象bean
步骤2: serverHandler channelRead 消息打印一下
步骤3:发送消息 serverHandler channelRead 里面
步骤4:msg bean不能直接发送,发送前需要编码

具体如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

最后看一下日志:

步骤1:解码有一个日志 log.info("反序列化出来的结果:"+record);
步骤2:进入 ServerHandler 有一个日志 log.info("Server Receive Message:"+record);,然后拼装 MessageRecord
步骤3:ServerHandler channelRead 发送没有日志
步骤4:编码有一个日志 log.info("==========开始进行消息编码==================");
在这里插入图片描述

在这里插入图片描述

最后回顾一下 server pipeline addLast 四个handler

在这里插入图片描述

3.3 编码和解码(了解即可)

编码,写出去,对象 变为 二进制流/byte[]数组
编码的目的是要写出去,通过 ObjectOutputStream 写出去,所以要将 对象 变为 二进制流/byte[]数组 ,然后传输到网络上去

protected void encode(ChannelHandlerContext ctx, MessageRecord msg, ByteBuf out)

msg 是收到的bean对象
然后将 bean 对象 序列化 byte[] 数组
out 是发送出去 byte[] 数组

在这里插入图片描述

解码函数里面拼装出一个 record 消息对象,如下:

解码,读进来,二进制流/byte[]数组 变为 对象
解码的目的对读进来二进制流处理,通过 ObjectInputStream 读进来,所以要将 二进制流/byte[]数组 变为 对象

protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out)

in 读进来 bytebuf 二进制数组
然后将 二进制数组 变为对象
放到 out 这个 list 里面

在这里插入图片描述

四、尾声

看懂代码就行,不难的。

源码下载:https://www.syjshare.com/res/XEE10LTG

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

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

相关文章

【Linux修炼】10.进程地址空间

每一个不曾起舞的日子&#xff0c;都是对生命的辜负。 进程地址空间本节目标1. 回顾C/C地址空间1.1 提出问题1.2 见问题产生的现象1.3 解释现象2. 虚拟地址空间2.1 感性理解虚拟地址空间 2.2 如何“画饼”2.3 地址空间的区域划分3. 进程地址空间与内存的关系3.1 虚拟地址和物理…

LabVIEW编程LabVIEW开发 ADAM-4056 DO模块例程与相关资料

LabVIEW编程LabVIEW开发 ADAM-4056 DO模块例程与相关资料 ​ADAM-4056SO是具有12通道自源型携带Modbus协议隔离数字输出模块。具有如下特点&#xff1a; ADO源电源故障检测 输入/输出类型&#xff1a;源式输出 12通道 数字输出&#xff1a;VCC&#xff1a; 1~35伏直流电&a…

基于Java+Mysql实现(WEB)宿舍管理系统【100010016】

数据库实践课程之宿舍管理系统 一、系统需求分析 1.1 系统描述 随着社会的发展以及教育水平的提高&#xff0c;当今社会在校生的数量越来越庞大&#xff0c;使用传统的方式对学生的信息进行管理效率非常低下。在互联网技术高度发达的今天&#xff0c;使用数据库技术对学生的…

Go 实现希尔排序算法及图解

耐心和持久胜过激烈和狂热。 哈喽大家好&#xff0c;我是陈明勇&#xff0c;今天分享的内容是使用 Go 实现希尔排序算法。如果本文对你有帮助&#xff0c;不妨点个赞&#xff0c;如果你是 Go 语言初学者&#xff0c;不妨点个关注&#xff0c;一起成长一起进步&#xff0c;如果本…

游戏开发51课 性能优化9

4.5 光照模型&#xff08;Lighting/Illumination Model&#xff09; 4.5.1 Flat Shading&#xff08;平面着色&#xff09; 根据表面法向量计算光照&#xff0c;并应用到整个面片上。速度最快&#xff0c;效果最差&#xff0c;容易暴露物体的多边形本质&#xff08;下图&…

微服务框架 SpringCloud微服务架构 29 ES 集群 29.4 分布式新增和查询流程

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构29 ES 集群29.4 分布式新增和查询流程29.4.1 ES集群的分布式存储29.4.2 总…

鸿蒙手机卸载内置应用 adb连接

鸿蒙手机傻瓜式卸载内置应用 adb连接**傻瓜式删除鸿蒙系统内置应用&#xff0c;自己亲测有效。**准备物品准备软件准备工作教程开始&#xff1a;第一步第二步完成包名列表一般软件谷歌服务格外的注意连接错误**鸣谢**傻瓜式删除鸿蒙系统内置应用&#xff0c;自己亲测有效。 准…

缓存数据丢了,原来是Redis持久化没玩明白

&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3; &#x1f38d;大家好&#xff0c;我是慕枫 &#x1f38d;前阿里巴巴高级工程师&#xff0c;InfoQ签约作者、阿里云专家博主&#xff0c;一直致力于用大白话讲解技术知识 &#x…

Windows下MySQL5.5升级5.7(或直接安装MySQL5.7)

Windows下MySQL5.5升级5.7&#xff08;或直接安装MySQL5.7&#xff09; 1、关闭MySQL服务&#xff1a; Ctrl shift Esc找到服务&#xff0c;找到下面的MySQL服务&#xff0c;停止服务。 2、卸载程序&#xff1a; 控制面板中卸载mysql5.5。 3、删除mysql5.5的安装目录及注…

Linux文件操作

文章目录前言什么是文件文件操作C语言文件操作接口文件操作系统调用接口文件描述符如何理解FILE和文件描述符的关系前言 本文主要介绍的是Linux系统下的文件操作和Linux的文件系统的机制&#xff0c;希望能够通过本文来增加读者对于文件操作的基本使用和理解。以及了解Linux系…

【大数据入门核心技术-Ambari】(一)Ambari介绍

一、什么是Ambari Apache Ambari是一种基于Web的工具&#xff0c;支持Apache Hadoop集群的供应、管理和监控。Ambari已支持大多数Hadoop组件&#xff0c;包括HDFS、MapReduce、Hive、Pig、 Hbase、Zookeeper、Sqoop和Hcatalog等。 Apache Ambari 支持HDFS、MapReduce、Hive、Pi…

C语言宏和预处理

C语言宏和预处理【1】include【2】【#pragma】【3】C #include【4】# 和 ## 操作符【5】宏替换【6】#line【7】#error【8】#undef【9】源码【10】结果【1】include #include本命令包含一个文件并在当前位置插入.一般尖括号意味着在标准库目录中搜索, #include “filename” 引…

【C语言与汇编】简单学学C到汇编代码

C语言与汇编 部分过程可参考C primer plus 本书余下的篇幅讨论源代码文件中的内容&#xff1b;本节讨论创建源代码文 件的技巧。有些C实现&#xff08;如Microsoft Visual C、Embarcadero C Builder、Apple Xcode、Open Watcom C、Digital Mars C和Freescale CodeWarrior&…

精品基于SSM的民宿预订管理系统

《民宿预订管理系统》该项目含有源码、论文等资料、配套开发软件、软件安装教程、项目发布教程等 使用技术&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;ssm 技术&#xff1a;JSP JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;my…

云原生事件驱动框架(KnativeEventing)

事件驱动是指事件在持续事务管理过程中&#xff0c;进行决策的一种策略。可以通过调动可用资源执行相关任务&#xff0c;从而解决不断出现的问题。通俗地说是当用户触发使用行为时对用户行为的响应。在 Serverless 场景下&#xff0c;事件驱动完美符合其设计初衷之一&#xff1…

基于xv6的Copy-On-Write

为什么需要写时拷贝呢&#xff1f; 当 shell执行指令的时候会 fork()&#xff0c;而这个 fork()出来的进程首先会调用的就是 exec来执行对应的命令&#xff0c;如果我们将 fork()创建的进程对地址空间进行了完整的拷贝,那将是一个巨大的消耗 因为在实际应用中&#xff0c;for…

SSM项目整合

文章目录1. 导入依赖2. 配置web.xml文件3. 编写springmvc.xml配置文件4. 编写spring.xml配置文件5. 编写项目整体业务逻辑6. 开发过程中常见状态码错误1. 导入依赖 在整合SSM项目时&#xff0c;需要导入以下依赖 Spring 相关依赖 &#xff08;springmvc相关、事务相关、spring…

凤姐从国外回来会再次爆红吗?她最近的一段话发人深省

随着互联网的发展&#xff0c;也诞生了很多的网红&#xff0c;其实现如今的众多网红&#xff0c;和凤姐比起来都是小巫见大巫。凤姐原名叫罗玉凤&#xff0c;当年因为参加各种选秀节目&#xff0c;再加上鬼使神差语无伦次的言谈&#xff0c;让她一夜之间爆红了网络。 其实当我们…

Pandas统计计数value_counts()的使用

value_counts()方法返回一个序列Series&#xff0c;该序列包含每个值的数量(对于数据框中的任何列&#xff0c;value_counts()方法会返回该列每个项的计数) value_counts()是Series拥有的方法&#xff0c;一般在DataFrame中使用时&#xff0c;需要指定对哪一列进行使用 语法 …

微服务框架 SpringCloud微服务架构 29 ES 集群 29.5 故障转移

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构29 ES 集群29.5 故障转移29.5.1 ES集群的故障转移29.5.2 总结29 ES 集群 …