基于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 上面来。这篇短文里面,我试着分析一下整个推文视频生成的流程,以及简要阐述一下有什么工具。 整体流程是这样: 分句 原文是按照段落组织的…...
PostgreSQL 冻结(Freeze)机制深度解析
PostgreSQL 冻结(Freeze)机制深度解析一、为什么需要冻结 1.1 事务 ID 的本质 PostgreSQL 用 32 位无符号整数表示事务 ID(XID),范围 0 ~ 2^32-1(约 42 亿)。 其中有三个特殊 XID:XI…...
Qt 5.12.8在Linux下编译qtvirtualkeyboard模块,我踩过的那些坑(附完整解决方案)
Qt 5.12.8在Linux下编译qtvirtualkeyboard模块的深度实践指南 当你在嵌入式或跨平台开发中突然发现系统自带的Qt缺少虚拟键盘模块时,那种感觉就像在沙漠里找到一瓶水却发现没带开瓶器。本文将带你深入探索在aarch64架构的Linux系统中,如何为预装的Qt 5.1…...
如何使用Compiler Explorer实时编译原理:揭秘代码到汇编的转换过程
如何使用Compiler Explorer实时编译原理:揭秘代码到汇编的转换过程 【免费下载链接】compiler-explorer Run compilers interactively from your web browser and interact with the assembly 项目地址: https://gitcode.com/gh_mirrors/co/compiler-explorer …...
基于CYBER-VISION零号协议构建智能技术文档翻译与摘要系统
基于CYBER-VISION零号协议构建智能技术文档翻译与摘要系统 1. 引言 对于很多开发者来说,阅读英文技术文档是件挺头疼的事。尤其是遇到一些前沿的开源项目,官方文档全是英文,里面还夹杂着大量的专业术语和复杂的配置说明。有时候,…...
Python 3.13 + CUDA 13.0编译轮子
核心工具链安装 1、安装 Visual Studio 2022 (勾选 “使用 C 的桌面开发”) 2、安装 CUDA Toolkit 13.0环境变量注入 在终端执行,确保编译器能精准定位 CUDA 路径:set CUDA_PATHD:\Program Files\NVIDIA_GPU_Computing_Toolkit\v13 set PATH%CUDA_PATH%\…...
Matlab 2024b 新变化:手把手教你搞定TI C2000代码生成环境(含CCS避坑指南)
Matlab 2024b与TI C2000代码生成环境配置全指南:从版本差异到实战避坑 如果你是一位长期使用Matlab进行TI C2000系列芯片开发的嵌入式工程师,升级到2024b版本后可能会发现:熟悉的配置界面不见了,命令行里输入的命令也不一样了。这…...
企业级Java SMB客户端:jcifs-ng深度架构解析与实战指南
企业级Java SMB客户端:jcifs-ng深度架构解析与实战指南 【免费下载链接】jcifs-ng A cleaned-up and improved version of the jCIFS library 项目地址: https://gitcode.com/gh_mirrors/jc/jcifs-ng jcifs-ng是一个经过彻底重构和优化的Java SMB客户端库&am…...
安卓逆向实战:用Frida绕过App反调试的5种常见检测(附完整脚本)
安卓逆向工程实战:Frida对抗反调试的深度解决方案 在移动安全研究领域,逆向工程师经常面临各种反调试技术的挑战。当传统的调试工具遭遇精心设计的防护机制时,往往束手无策。本文将深入探讨五种主流反调试检测手段的对抗策略,提供…...
如何零门槛集成专业金融图表?从技术选型到上线的全流程攻略
如何零门槛集成专业金融图表?从技术选型到上线的全流程攻略 【免费下载链接】charting-library-examples Examples of Charting Library integrations with other libraries, frameworks and data transports 项目地址: https://gitcode.com/gh_mirrors/ch/charti…...
保姆级拆解:MIT-BEVFusion中Swin Transformer如何高效处理多相机图像(附代码逐行分析)
多相机BEV感知中的Swin Transformer实战:从原理到MIT-BEVFusion代码精要 在自动驾驶感知系统中,如何高效处理多相机输入并构建统一的鸟瞰视图(BEV)表征一直是核心挑战。本文将深入探讨Swin Transformer在多相机BEV感知中的创新应用…...
