基于RabbitMQ的模拟消息队列之六——网络通信设计
自定义基于TCP的应用层通信协议。实现客户端对服务器的远程调用
编写服务器及客户端代码
文章目录
- 基于TCP的自定义应用层协议
- 一、请求
- 1.请求格式
- 2.创建Request类
- 二、响应
- 1.响应格式
- 2.创建Response类
- 三、客户端-服务器交互
- 四、type
- 五、请求payload
- 1.BasicAruguments(方法公共参数)
- 2.每个方法的参数
- ExchangeDelareArguments
- ExchangeDeleteArguments
- QueueDeclareArguments
- QueueDeleteArguments
- QueueBindArguments
- QueueUnbindArguments
- BasicPublishArguments
- BasicConsumeArguments
- BasicAckArguments
- 六、响应payload
- 1.BasicReturns(返回结果公共参数)
- 2.SubscribeReturns
- 编写服务器代码
- 一、创建BrokerServer
- 二、初始化ServerSocket
- 三、开启服务器
- 四、停止服务器(便于测试)
- 五、处理连接
- 1.读取请求并解析
- 2.根据请求计算响应
- 3.将响应返回给客户端
- 4.清除有关断开连接的socket对应的会话信息
- 编写客户端代码
- 一、ConnectionFactory 连接工厂
- 创建Connection对象
- 二、Connection 一次TCP连接
- 1.Connection 属性
- 2.初始化
- 3.写入请求
- 4.读取响应
- 5.创建channel
- 6.处理响应
- 7.关闭连接
- 三、Channel 逻辑上的连接
- 1.属性
- 2.API(远程调用服务器的)
- 创建channel
- 销毁channel
- 创建交换机
- 删除交换机
- 创建队列
- 删除队列
- 创建绑定
- 删除绑定
- 发布消息
- 订阅消息
- 确认消息
- 3.实现阻塞等待服务器的响应
- waitResult
- putResult
- 编写Demo
- 1.生产者客户端
- 2.消费者客户端
- 测试
- 1. 启动服务器
- 2.启动生产者
- 3.启动消费者
基于TCP的自定义应用层协议
一、请求
1.请求格式

type:哪个方法
length:payload的长度
payload:调用的方法的参数
2.创建Request类

二、响应
1.响应格式

type:哪个方法
length:payload的长度
payload:调用的方法的结果
2.创建Response类

三、客户端-服务器交互

四、type
- 0X1 创建channel
- 0X2 销毁channel
- 0X3 创建交换机 exchangeDeclare
- 0X4 删除交换机 exchangeDelete
- 0X5 创建队列 queueDeclare
- 0X6 删除队列 queueDelete
- 0X7 创建绑定 queueBind
- 0X8 删除绑定 queueUnbind
- 0X9 发布消息 basicPublish
- 0Xa 订阅消息 basicConsume
- 0xb 确认消息 basicAck
- 0xc 服务器给客户端推送消息(响应独有)
五、请求payload
1.BasicAruguments(方法公共参数)
- rid(一次请求/响应)
- channelId(一次逻辑上的连接)
2.每个方法的参数
需要继承BasicArguments
ExchangeDelareArguments

ExchangeDeleteArguments

QueueDeclareArguments

QueueDeleteArguments

QueueBindArguments

QueueUnbindArguments

BasicPublishArguments

BasicConsumeArguments

BasicAckArguments

以ExchangeDeclare方法为例,具体的请求格式如下:

六、响应payload
1.BasicReturns(返回结果公共参数)
- rid (一次请求/响应)
- channelId (一次逻辑上的连接)
- ok (方法运行结果)
以exchangeDeclare为例,具体的响应格式:

其他的方法返回的响应payload都是BasicReturns序列化后的结果,除了0xc,是响应独有的。
2.SubscribeReturns
服务器通过Consumer接口实现推送消息给客户端(队列收到消息的时候会调用回调方法)

响应具体格式:

编写服务器代码
一、创建BrokerServer

二、初始化ServerSocket
给Serversocket初始化,监听一个端口

三、开启服务器
- 接受客户端的连接请求
- 线程池处理连接

四、停止服务器(便于测试)
- runnable设置成false
- 抛弃线程池的所有任务
- 关闭ServerSocket服务器连接

五、处理连接
- 读取请求并解析
- 根据请求计算响应
- 将响应返回给客户端
- 关闭客户端连接
- 清除断开连接的socket的会话信息(channelId-socket)

1.读取请求并解析

2.根据请求计算响应

3.将响应返回给客户端

4.清除有关断开连接的socket对应的会话信息

编写客户端代码
一、ConnectionFactory 连接工厂
- 服务器地址
- 创建connecion对象
创建Connection对象

二、Connection 一次TCP连接
- socket对象 socket=new socket(host,port)
- 多个channel 对象 (创建channel对象)
- 写入请求
- 读取响应
- 处理响应
1.Connection 属性

2.初始化

3.写入请求

4.读取响应

5.创建channel

6.处理响应
此处在构造方法中,补充创建一个扫描线程,当连接未断开时,不停的扫描(读取)服务器返回的响应。处理响应。
如果是SubScirbleReturns,使用线程池执行消费者的回调。
如果是BasicReturns,将响应的basicReturns放入对应channel的basicReturnsMap中。


7.关闭连接

三、Channel 逻辑上的连接
- 对应API,实现客户端对服务器的远程调用
1.属性

2.API(远程调用服务器的)
- 构造请求
- 写入请求
- 阻塞等待服务器的响应结果
生成rid:

创建channel

销毁channel

创建交换机

删除交换机

创建队列

删除队列

创建绑定

删除绑定

发布消息

订阅消息

确认消息

3.实现阻塞等待服务器的响应
waitResult
根据rid,在basicReturnsMap集合中找;如果找到了,就返回,找不到阻塞等待。

putResult
将rid-basicReturns 放入basicReturnsMap集合中

编写Demo
实现消息队列生产者-消费者模型。
1.生产者客户端

2.消费者客户端

测试
1. 启动服务器


2.启动生产者

3.启动消费者

相关文章:
基于RabbitMQ的模拟消息队列之六——网络通信设计
自定义基于TCP的应用层通信协议。实现客户端对服务器的远程调用 编写服务器及客户端代码 文章目录 基于TCP的自定义应用层协议一、请求1.请求格式2.创建Request类 二、响应1.响应格式2.创建Response类 三、客户端-服务器交互四、type五、请求payload1.BasicAruguments(方法公共…...
算法:数组中的最大差值---“打擂台法“
文章来源: https://blog.csdn.net/weixin_45630258/article/details/132737088 欢迎各位大佬指点、三连 1、题目: 给定一个整数数组 nums,找出给定数组中两个数字之间的最大差值。要求,第二个数字必须大于第一个数字。 2、分析特…...
三种方式查看 JVM 垃圾收集器
一、引言 不同版本的 JVM 默认使用的垃圾收集器是不同的,目前的新生代和老年代的垃圾收集器如下图所示,新生代和老年代之间的连线表示这些垃圾收集器可以进行搭配使用 垃圾收集器的名字和 JVM 里面的参数对照表如下,即在 JVM 里面并不是存储的…...
React中函数式组件与类组件有何不同?
Function Component 与 Class Component 有何不同 目录 Function Component 与 Class Component 有何不同 文章核心观点: 解释一下: 总结: 文章核心观点: Function components capture the rendered values.函数式组件捕获…...
windows11安装docker时,修改默认安装到C盘
1、修改默认安装到C盘 2、如果之前安装过docker,请删除如下目录:C:\Program Files\Docker 3、在D盘新建目录:D:\Program Files\Docker 4、winr,以管理员权限运行cmd 5、在cmd中执行如下命令,建立软联接: m…...
python模块之 aiomysql 异步mysql
mysql安装教程 mysql语法大全 python 模块pymysql模块,连接mysql数据库 一、介绍 aiomysql 是一个基于 asyncio 的异步 MySQL 客户端库,用于在 Python 中与 MySQL 数据库进行交互。它提供了异步的数据库连接和查询操作,适用于异步编程环境 …...
开开心心带你学习MySQL数据库之第八篇
索引和事务 ~~ 数据库运行的原理知识 面试题 索引 索引(index) > 目录 索引存在的意义,就是为了加快查找速度!!(省略了遍历的过程) 查找速度是快了,但是付出了一定的代价!! 1.需要付出额外的空间代价来保存索引数据 2.索引可能会拖慢新增,删除,修改的速度 ~~ …...
yml配置动态数据源(数据库@DS)与引起(If you want an embedded database (H2, HSQL or Derby))类问题
1:yml 配置 spring:datasource:dynamic:datasource:master:url: jdbc:mysql://192.168.11.50:3306/dsdd?characterEncodingUTF-8&useUnicodetrue&useSSLfalse&tinyInt1isBitfalse&allowPublicKeyRetrievaltrue&serverTimezoneUTCusername: ro…...
yolov5运行过程遇到的小问题(随时更新)
1.关于git的问题 解决办法:插入下面代码 import os os.environ["GIT_PYTHON_REFRESH"] "quiet"2.页面太小无法完成操作 解决办法: 如果不好使再考虑降低Batch_Size大小或者调整虚拟内存可用硬盘空间大小!(调整虚拟内存…...
使用FabricJS创建Image对象的JSON表示
本篇文章介绍一下如何创建图像的 JSON 表示形式 使用 FabricJS 的对象。我们可以通过创建一个实例来创建一个 Image 对象 织物.图像。由于它是FabricJS的基本元素之一,我们也可以轻松地 通过应用角度、不透明度等属性来自定义它。为了创建 JSON Image 对象的表示&am…...
【牛客刷题】反转固定区间链表、每k个节点一组反转
链表内指定区间反转_牛客题霸_牛客网 ListNode* reverseList(ListNode* head, ListNode* tail) {ListNode* pre nullptr;ListNode* cur head;while (cur ! tail) { 最后cur就是tailListNode* temp cur->next;cur->next pre;pre cur;cur temp;}return pre;}ListNode…...
算法:数组常见套路1---双指针、取模、打擂台法
文章来源: https://blog.csdn.net/weixin_45630258/article/details/132738318 欢迎各位大佬指点、三连 一、数组的合并–双指针[快慢指针] 1、题目: 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ࿰…...
App 出海实践:Google Play 结算系统
作者:业志陈 现如今,App 出海热度不减,是很多公司和个人开发者选择的一个市场方向。App 为了实现盈利,除了接入广告这种最常见的变现方式外,就是通过提供各类虚拟商品或者是会员服务来吸引用户付费了,此时 …...
国际慈善日 | 追寻大爱无疆,拓世科技集团的公益之路
每年的9月5日,是联合国大会正式选定的国际慈善日。这一天的设立,旨在通过提高公众对慈善活动的意识,鼓励慈善公益活动通过各种形式在全球范围内得到增强和发展。这是一个向慈善公益事业致敬的日子,同时也是呼吁全球团结一致共同发…...
关于DNS的一些认识
目录 什么是DNS? 一台具有单个DNS的机器可以拥有多个地址吗? 一台计算机可以有多个属于不同顶级域的DNS名字吗? 什么是DNS? DNS是域名系统(Domain Name System)的缩写,它是互联网中用于将域名…...
游戏性能优化
Unity性能优化主要包括以下方面: 1.渲染性能 。包括减少Draw Calls、减少三角面数、使用LOD、使用批处理技术、减少实时光源等,以提高游戏的帧率和渲染效率。 2.内存性能 。包括使用对象池、使用合适的纹理、使用异步加载资源等,以减少内存占…...
公开游戏、基于有向图的游戏
目录 〇,背景 一,公开游戏、策梅洛定理 1,公开游戏 2,策梅洛定理 二,有向图游戏 1,狭义有向图游戏 2,广义有向图游戏 3,狭义有向图游戏的SG数 4,Bash Game 力扣…...
CSS学习笔记05
CSS笔记05 定位 position CSS 属性position - 用于指定一个元素在文档中的定位方式。top,right,bottom 和 left 属性则决定了该元素的最终位置。position 有以下常用的属性值: position: static; - 默认值。指定元素使用正常的布局行为&am…...
Linux查看指定端口是否被占用
在Linux中,可以使用多种方法来检查一个特定端口(例如3306,通常由MySQL使用)是否被占用: 使用netstat命令: 如果系统中已安装了netstat,可以使用以下命令检查3306端口: netstat -tuln | grep 330…...
【Python 自动化】小说推文一键生成思路概述
最近看了一下小说推文成品软件的思路,发现可以完全迁移到我的 BookerAutoVideo 上面来。这篇短文里面,我试着分析一下整个推文视频生成的流程,以及简要阐述一下有什么工具。 整体流程是这样: 分句 原文是按照段落组织的…...
为AI智能体注入人类洞察:用户研究技能全链路实践指南
1. 项目概述:为AI智能体注入“人类洞察层”如果你正在构建或使用AI智能体,无论是Claude Code、Cursor还是其他基于代码的智能助手,你可能会发现一个核心瓶颈:这些智能体虽然能处理代码、分析数据,但在涉及产品决策、功…...
Arm嵌入式编译器C/C++库架构与优化实践
1. Arm嵌入式编译器C/C库架构解析 1.1 运行时库体系结构 Arm Compiler for Embedded提供完整的C/C标准库实现,其架构设计遵循分层原则: 基础层 :ISO C99标准库(libc)提供字符串处理、内存管理、数学运算等基础功能 …...
别再为Matlab地图发愁了!手把手教你用m_map搞定世界地图与中国省界图(附最新shp文件下载)
用m_map工具箱高效绘制专业地图:从安装到论文级可视化实战 第一次接触Matlab绘制地图时,我盯着报错信息发呆了半小时——明明按照教程操作,为什么地图显示一片空白?后来才发现是shp文件路径中多了一个空格。这种看似简单的细节&am…...
【Midjourney 2026审美趋势白皮书】:基于127万组V6–V7生成样本的AI视觉演化模型预测
更多请点击: https://intelliparadigm.com 第一章:Midjourney 2026审美趋势白皮书导论 人工智能图像生成正从“可用”迈向“可策展”阶段。Midjourney v6.5 及其预发布的 Beta-2026 引擎已展现出对文化语境、跨媒介质感与时间性美学的深层建模能力——这…...
【ElevenLabs商业增长实战手册】:20年AI语音赛道老兵亲授从0到月营收$2M的7个关键跃迁节点
更多请点击: https://intelliparadigm.com 第一章:ElevenLabs商业增长的核心范式迁移 传统AI语音服务商长期依赖“API调用量时长计费”模型,而ElevenLabs正系统性重构价值交付逻辑——从卖计算资源转向卖情感可信度与品牌声纹资产。这一迁移…...
城市级智慧停车平台建设思路:如何整合多个停车项目的数据
引言随着城市化进程的加速和机动车保有量的持续攀升,"停车难、停车乱"已经成为困扰各大城市的普遍性问题。根据公安部统计数据,截至2025年底,全国机动车保有量已突破4.5亿辆,而城市停车位缺口预计超过8000万个。与此同时…...
模块化前端框架设计:从原子状态到组合式架构的工程实践
1. 项目概述:一个轻量级、模块化的现代Web应用框架最近在梳理手头的几个前端项目,发现随着功能迭代,代码越来越臃肿,不同项目间的基础工具函数、状态管理逻辑、路由配置总是要重新写一遍,或者复制粘贴,维护…...
Vivado时序约束实战:输入/输出延时设置背后的时序模型与设计考量
1. 时序约束的本质:从理论到实践的桥梁 刚接触FPGA设计时,我最头疼的就是时序约束。那些建立时间、保持时间的概念看得人云里雾里,更别说要在Vivado里实际设置了。直到有一次项目因为时序问题导致整板无法工作,我才真正明白时序约…...
STM32CUBEMX实战指南:串口DMA高效收发与自定义打印函数优化
1. 串口DMA基础与STM32CubeMX配置 第一次用STM32CubeMX配置串口DMA时,我对着密密麻麻的选项差点崩溃。后来发现只要掌握几个关键点,5分钟就能搞定稳定可靠的DMA通信。先解释下为什么需要DMA:当你用传统方式通过串口发送"Hello World&quo…...
题目五:抽象类 + 接口 混合实现
编程要求:抽象类 Machine:抽象方法 work(),普通方法 start();接口 Clean:抽象方法 clean();类 Robot继承抽象类 Machine 实现接口 Clean;实现所有未实现的方法;测试创建机器人对象&…...
