码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 基于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.启动消费者

    在这里插入图片描述

  • 相关阅读:
    植物大战僵尸变态辅助开发系列教程(E语言实现和VC6实现)(上)
    MySQL出现“Lock wait timeout exceeded”错误的原因是什么?
    腾讯前端二面常考react面试题总结
    【GPT引领前沿】GPT4技术与AI绘图
    【活动回顾】ABeam News | 庆祝ABeam德硕与毕博中国战略合作十周年,关系再升级
    MySQL MVVC多版本并发控制
    非零基础自学Java (老师:韩顺平) 第5章 程序控制结构 5.7 for循环控制
    「记录」MMDetection入门篇
    Gemmini测试test文件chisel源码详解(四)
    若依框架的使用+代码生成功能
  • 原文地址:https://blog.csdn.net/m0_71690645/article/details/132627776
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号