基于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.启动消费者

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英国私校的艺术奖学金有哪些?申请要求和申请流程详解!

众所周知,英国私校不仅学术拔尖,在对学生艺术方面的培养也是毫不逊色的。几乎打开每一所英国私校的官网,都可以看到学校罗列的提供的各类课外艺术活动的精彩照片。      每个英国私校除了课后开设的五花八门的兴趣课外,还有各…

【c++】stringstream基础:实现数据类型转换和字符串分割

传统实现整型转换为字符串需要使用itoa或者sprintf,对于itoa和atoi的使用可以看文章: atoi和itoa极简无废话概述 但是用这两个函数进行转换时,所需要的空间事先不确定,所以可能造成程序崩溃,今天介绍的stringstream可…

数字 IC 设计职位经典笔/面试题(四)

共100道经典笔试、面试题目(文末可全领) 画出 CMOS 电路的晶体管级电路图,实现 YA*BC(DE).? 画出 YABC 的 CMOS 电路图,画出 YABCD 的 CMOS 电路图。 利用与非门和或非门实现 YABC(DE)((AB’)(CD)’(CE)’)’ 三个两输入与非门&a…

pc端字体为什么到12像素以后不生效

pc端字体为什么到12像素以后不生效&#xff1f; 因为谷歌浏览器默认的最小字体是12像素&#xff0c;如果去‘设置’里面修改最小字体&#xff0c;是可以达到修改效果的&#xff0c;但是&#xff0c;你不能解决用户的浏览器设置 解决办法如下 <p class"font">…

《C++设计模式》——结构型

前言 结构模式可以让我们把很多小的东西通过结构模式组合起来成为一个打的结构&#xff0c;但是又不影响各自的独立性&#xff0c;尽可能减少各组件之间的耦合。 Adapter Class/Object(适配器&#xff09; Bridge(桥接&#xff09; Composite(组合) Decorator(装饰) 动态…

【AI】《动手学-深度学习-PyTorch版》笔记(二十二):单发多框检测(SSD)

AI学习目录汇总 1、介绍 SSD(Single Shot MultiBox Detector)单发多框检测。“Single shot”说明SSD算法属于one-stage(一段式)方法,“MultiBox”说明SSD是多框预测(多尺度锚框/特征图)。 SSD和YOLO一样都是采用CNN网络执行one-stage(一段式)检测,区别是: YOLO速…

【面试心得】系统调用

这个问题也是在九识面试的时候被问到的&#xff0c;当时我说就是像Shell&#xff0c;从用户态转移到内核态的过程&#xff0c;面试官让我说的详细一点&#xff0c;我就说不出来了&#xff0c;然后我就说了一些函数调用的过程&#xff0c;hhhh。 现在在这里做一个记录吧。 本文…

文心一言初体验,和ChatGPT语言理解能力比较

文章目录 第一个考验&#xff0c;语义理解第二个考验&#xff0c;历史问题的回答推荐阅读 百度旗下AI大模型文心一言宣布向全社会全面开放,所有用户都可以体验这款AI大模型了。要比较这两个语言模型&#xff0c;我们先设计好题目。 第一个考验&#xff0c;语义理解 题目1&…

【韩顺平】Linux基础

目录 1.网络连接三种方式 1.1 桥接模式&#xff1a;虚拟系统可以和外部系统通讯&#xff0c;但是容易造成IP冲突【1-225】 1.2 NAT模式&#xff1a;网络地址转换模式。虚拟系统可以和外部系统通讯&#xff0c;不造成IP冲突。 1.3 主机模式&#xff1a;独立的系统。 2.虚拟机…

Java 多线程系列Ⅵ(并发编程的六大组件)

JUC 组件 前言一、Callable二、ReentrantLock三、Atomic 原子类四、线程池五、Semaphore六、CountDownLatch 前言 JUC&#xff08;Java.util.concurrent&#xff09;是 Java 标准库中的一个包&#xff0c;它提供了一组并发编程工具&#xff0c;本篇文章就介绍几组常见的 JUC 组…

【送书活动】揭秘分布式文件系统大规模元数据管理机制——以Alluxio文件系统为例

前言 「作者主页」&#xff1a;雪碧有白泡泡 「个人网站」&#xff1a;雪碧的个人网站 「推荐专栏」&#xff1a; ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄&#xff0c;vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

C++-map和set

本期我们来学习map和set 目录 关联式容器 键值对 pair 树形结构的关联式容器 set multiset map multimap 关联式容器 我们已经接触过 STL 中的部分容器&#xff0c;比如&#xff1a; vector 、 list 、 deque 、forward_list(C11)等&#xff0c;这些容器统称为序列式…

【Ubuntu搭建MQTT Broker及面板+发布消息、订阅主题】

Ubuntu搭建MQTT Broker及面板发布消息、订阅主题 配置curl数据源 curl -s https://assets.emqx.com/scripts/install-emqx-deb.sh | sudo bash开始安装 sudo apt-get install emqx启动 sudo emqx start使用面板 根据自己的服务器是否开始了防火墙放行端口&#xff08;1808…

YOLO目标检测——火焰烟雾数据集+已标注VOC和YOLO格式标签下载分享

实际项目应用&#xff1a;火灾预警系统、智能监控系统、工业安全管理、森林火灾监测以及城市规划和消防设计等应用场景中具有广泛的应用潜力&#xff0c;可以提高火灾检测的准确性和效率&#xff0c;保障人员和财产的安全。数据集说明&#xff1a;YOLO火焰目标检测数据集&#…

合宙Air724UG LuatOS-Air LVGL API控件-截屏(Screenshots)

截屏&#xff08;Screenshots&#xff09; 分 享导出pdf 截屏功能&#xff0c;core版本号要>3211 示例代码 -- 创建图片控件img lvgl.img_create(lvgl.scr_act(), nil)-- 设置图片显示的图像lvgl.img_set_src(img, "/lua/test.png")-- 图片居中lvgl.obj_align(…

Kafka入门与安装

为什么要用消息中间件&#xff1f; 异步处理 场景说明&#xff1a;用户注册后&#xff0c;需要发注册邮件和注册短信。传统的做法有两种1.串行的方式&#xff1b;2.并行方式。 串行方式&#xff1a;将注册信息写入数据库成功后&#xff0c;发送注册邮件&#xff0c;再发送注…

elementUI时间选择器

<template>//月选择器//:clearable"false" 去掉<div class"monthCard"><el-date-picker:clearable"false"v-model"monthValue"type"month"placeholder"选择月"change"handleChangeMonth($eve…

vue3笔记

vue3笔记 vue3官网 尚硅谷视频 黑马视频 ## vue3的main.js 1.vue3 import { createApp } from vue // 引入createApp方法 import App from ./App.vue // 引入App根组件 createApp(App).mount(#app) // 创建一个 Vue 实例&#xff0c;并将其挂载到 id 为 "app" 的 …

静态工厂模式,抽象工厂模式,建造者模式

静态工厂模式 ublic class FruitFactory {public static Fruit getFruit(String name) {Fruit fnull;switch (name){case "APPLE":{fnew Apple();}case "BANANA":{fnew Banana();}default :{System.out.println("Unknown Fruit");}}return f;} …

RabbitMQ 知识点解读

1、AMQP 协议 1.1、AMQP 生产者的流转过程 当客户端与Broker 建立连接的时候&#xff0c;会调用factory .newConnection 方法&#xff0c;这个方法会进一步封装成Protocol Header 0-9-1 的报文头发送给Broker &#xff0c;以此通知Broker 本次交互采用的是AMQPO-9-1 协议&…