[四]RabbitMQ-客户端源码之Frame

本文详细介绍了AMQP协议中Frame的基本组成及其类型,包括方法帧、内容头帧、内容体帧和心跳帧,并解释了各帧的功能及作用。

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

欢迎跳转到本文的原文链接:https://honeypps.com/mq/rabbitmq-client-source-code-of-frame/


Frame是指AMQP协议层面的通信帧(一个正式定义的连接数据包)。
我们来看下Frame类中的成员变量有哪些:

/** Frame type code */
public final int type;

/** Frame channel number, 0-65535 */
public final int channel;

/** Frame payload bytes (for inbound frames) */
private final byte[] payload;

/** Frame payload (for outbound frames) */
private final ByteArrayOutputStream accumulator;

Frame里的三个成员变量:type, channel, payload是真正和报文有关的。accumulator是为了方便内部编程的一个变量。Frame类就是对这个玩意儿捯饬捯饬,没有什么难度,好奇的同学可以自己翻看下,本文主要来阐述下AMQP中的Frame的一些信息。

一个通信帧的协议层面的结构如下:

序号名称占用字节
1frame type1B
2channel number2B
3payload length4B
4payload[0-N]B
5FRAME_END(结束帧)1B(0xCE)

这样可以知道:一个通信帧的最小大小为:1B+2B+4B+0B+1B=8B.

AMQP 定义了如下的帧类型:

  1. Type = 1, “METHOD”: 方法帧
  2. Type = 2, “HEADER”: 内容头帧
  3. Type = 3, “BODY”: 内容体帧.
  4. Type = 8, “HEARTBEAT”: 心跳帧.

通道编号为0的代表全局连接中的所有帧,1-65535代表特定通道的帧.

方法帧
type=1, payload包含以下内容:
classId:2B
methodId:2B
argument:NB

内容头帧
type=2,payload包含以下内容
classId:2B
weight:2B
BodySize:8B
property flags:2B
properties: NB

内容帧
type=3, payload不进行具体解析,

心跳帧
tpye=8,没有payload。心跳帧的channel number必须为0。


附:本系列全集

  1. [Conclusion]RabbitMQ-客户端源码之总结
  2. [一]RabbitMQ-客户端源码之ConnectionFactory
  3. [二]RabbitMQ-客户端源码之AMQConnection
  4. [三]RabbitMQ-客户端源码之ChannelManager
  5. [四]RabbitMQ-客户端源码之Frame
  6. [五]RabbitMQ-客户端源码之AMQChannel
  7. [六]RabbitMQ-客户端源码之AMQCommand
  8. [七]RabbitMQ-客户端源码之AMQPImpl+Method
  9. [八]RabbitMQ-客户端源码之ChannelN
  10. [九]RabbitMQ-客户端源码之Consumer

欢迎跳转到本文的原文链接:https://honeypps.com/mq/rabbitmq-client-source-code-of-frame/


欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。


### 使用RabbitMQ与C++ 为了在C++项目中集成并使用RabbitMQ,开发者通常会选择官方支持的客户端库之一。对于C++而言,最常用的选项是`rabbitmq-c`这个基于AMQP协议实现的原生C语言客户端[^1]。 #### 安装依赖 安装必要的开发工具包以及配置环境变量来编译和链接程序之前,确保操作系统已经正确设置了构建环境。以Ubuntu为例: ```bash sudo apt-get update && sudo apt-get install -y cmake libssl-dev ``` 接着下载并编译`rabbitmq-c`源码仓库中的最新稳定版本[^2]: ```bash git clone https://github.com/alanxz/rabbitmq-c.git cd rabbitmq-c mkdir build && cd build cmake .. make sudo make install ``` #### 发布消息到队列 下面是一个简单的例子展示怎样发送一条消息至指定名称的消息队列内: ```cpp #include <iostream> #include <amqp.h> #include <amqp_tcp_socket.h> int main() { amqp_connection_state_t conn; int status; // 创建连接对象实例化 conn = amqp_new_connection(); struct amqp_rpc_reply_t reply; struct amqp_channel_open_ok_t *channel_res; // 建立TCP套接字通信链路 amqp_socket_t* socket = amqp_tcp_socket_new(conn); if (!socket) { std::cerr << "Creating TCP socket failed\n"; return 1; } status = amqp_socket_open(socket, "localhost", 5672); // 连接到本地服务器,默认端口为5672 if (status < 0) { std::cerr << "Opening TCP connection failed\n"; return 1; } // 登录虚拟主机"/" reply = amqp_login(conn, "/", AMQP_DEFAULT_MAX_CHANNELS, AMQP_DEFAULT_FRAME_SIZE, 0, AMQP_SASL_METHOD_PLAIN, "guest", "guest"); if (reply.reply_type != AMQP_RESPONSE_NORMAL) { std::cerr << "Logging in failed\n"; return 1; } uint16_t channel_id = 1; amqp_channel_open(conn, channel_id); char const* exchange_name = ""; char const* routing_key = "hello"; amqp_basic_properties_t props; props._flags = AMQP_BASIC_CONTENT_TYPE_FLAG | AMQP_BASIC_DELIVERY_MODE_FLAG; props.content_type = amqp_cstring_bytes("text/plain"); props.delivery_mode = 2; /* persistent delivery mode */ amqp_basic_publish( conn, /* the connection */ channel_id, /* default channel */ amqp_cstring_bytes(exchange_name),/* no name */ amqp_cstring_bytes(routing_key), 0, /* mandatory */ 0, /* immediate */ &props, amqp_cstring_bytes("Hello World!") ); printf(" [x] Sent 'Hello World!'\n"); sleep(1); amqp_channel_close(conn, channel_id, AMQP_REPLY_SUCCESS); amqp_connection_close(conn, AMQP_REPLY_SUCCESS); amqp_destroy_connection(conn); return 0; } ``` 此段代码展示了创建一个新的连接、登录认证过程、打开信道(Channel),最后通过调用`amqp_basic_publish()`函数向名为“hello”的路由键所对应的队列发布了一条字符串形式的消息:"Hello World!"[^3]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值