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

基于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 &#xff0…...

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 上面来。这篇短文里面,我试着分析一下整个推文视频生成的流程,以及简要阐述一下有什么工具。 整体流程是这样: 分句 原文是按照段落组织的&#xf…...

MySQL中的字符集与排序规则详解

在 MySQL 中,字符集(Character Set)用于确定可以在数据库中存储的字符集合,而排序规则(Collation)用于指定比较和排序字符串的规则。下面是关于 MySQL 中字符集和排序规则的一些详细信息: 字符集…...

Java中如何进行加锁??

笔者在上篇文章介绍了线程安全的问题,接下来本篇文章就是来讲解如何避免线程安全问题~~ 前言:创建两个线程,每个线程都实现对同一个变量count各自自增5W次,我们来看一下代码: class Counter{private int count0;publi…...

Pytorch3D多角度渲染.obj模型

3D理解在从自动驾驶汽车和自主机器人到虚拟现实和增强现实的众多应用中发挥着至关重要的作用。在过去的一年里,PyTorch3D已经成为一个越来越流行的开源框架,用于使用Python进行3D深度学习。值得庆幸的是,PyTorch3D 库背后的人员已经完成了实现…...

MyBatisPlus 基础Mapperr接口:增删改查

MyBatisPlus 基础Mapper接口:增删改查 插入一条数据 代码 Testpublic void insert() {User user new User();user.setId(6L);user.setName("张三");user.setAge(25);user.setEmail("zhangsanexample.com");userMapper.insert(user);}日志 数…...

计算机网络与技术——概述

😊计算机网络与技术——概述 👻前言🥏信息时代下计算机网络的发展🌏互联网概述📡计算机网络基本概念📡互联网发展三阶段📡互联网的标准化 🌏互联网的组成📡互联网的边缘部…...

详解TCP/IP协议第三篇:通信数据在OSI通信模型的上下传输

文章目录 一:OSI通信模型间数据传输展示 二:应用层到会话层解析 1:应用层 2:表现层 3:会话层...

《C++ primer plus》精炼(OOP部分)——对象和类(2)

“学习是人类成长的喷泉。” - 亚里士多德 文章目录 内联函数对象的方法和属性构造函数和析构函数构造函数的种类使用构造函数析构函数列表初始化 const成员函数this指针对象数组类作用域作用域为类的常量类作用域内的枚举 内联函数 定义位于类声明中的函数自动成为内联函数。…...

一点感受

做了两天企业数字化转型的评委,涉及全国最顶级的公司、最顶级的实际落地项目案例,由企业真实的落地团队亲自当面讲解。主要是为了了解了解真实的一线、真实的客户、真实的应用现状和应用水平。 (1)现状 我评审的涉及底层技术平台&…...

VirtualBox RockyLinux9 网络连接

有几次都是隔一段时间之后启动虚拟机,用第三方ssh工具就连接不上了。 简单记录一下。 1、VirtualBox设置 2、IP设置 cd /etc/NetworkManager/system-connections/ vim enp0s3.nmconnection[connection] idenp0s3 uuid9c404b41-4636-397c-8feb-5c2ed38ef404 typeet…...

java 实现适配器模式

适配器模式(Adapter Pattern)是一种结构型设计模式,用于将一个类的接口转换成另一个类的接口,使得原本不兼容的类可以协同工作。适配器模式包括两种类型:类适配器和对象适配器。下面分别介绍这两种类型的实现方式。 类…...

wordpress html5 app/如何做好网站站内优化

1.mysql DAYOFWEEK 和 WEEKDAY获取星期 在mysql中,我们可以用DAYOFWEEK 和 WEEKDAY函数获取指定日期的星期。区别在于DAYOFWEEK获取的星期索引是以1开始,而WEEKDAY获取的星期索引是以0开始. DAYOFWEEK(date) 返回日期date的星期索引(1星期天&#xff0…...

帝国cms如何做网站地图/西地那非片吃了能延时多久

版权声明:原创作品,谢绝转载!否则将追究法律责任。 一个Objective-c类定义了一个对象结合数据相关的行为。有时候,这使得他有意义的表达单个任务或者单元的行为。而不是集合的方法。 blocks是语言的特性,我们可以在C C…...

自建服务器做网站要备案/大数据培训班出来能就业吗

怎么web修改服务器地址 内容精选换一换园区智能体的算法服务支持的输出类型为Webhook。在创建作业前您需确保Webhook Service已运行成功。下面以一个简单的python脚本作为示例,展示如何启动Webhook Service并保存接收的数据。准备一台本地的Linux服务器,…...

网页制作与网站建设宝典 第2版/seo优化网站词

功能 : 无需索引来访问数组元素和集合元素 String [] bookls {"你好", "黑哥", "笑一个呀"}; for(String book : books){System.out.println(book); }其中book将会自动跌送每个数组元素...

满亦工作室 网站建设/推广方案应该有哪些方面

个人是跑业务的上班族,平时加班累成狗就不说了,主要是跑外勤的时间比较多,在外面接电话真的是太不方便了。为此,曾经花大价钱买过AirPods pro,但是在非常嘈杂的环境中,通话降噪效果真的一般般。后来一次搞定…...

企业所得税怎么缴纳/杭州seo网络公司

小样本学习&元学习经典论文整理||持续更新 核心思想 本文设计了一种利用孪生网络结构解决小样本分类任务的方法,其思想非常简单,用相同的网络结构分别对两幅图像提取特征,如果两幅图像的特征信息非常接近(L1距离小&#xff0…...