新的页游采用AMF3协议作为通讯协议。 网上相当一部分人说找不到AMF3协议的C++实现,不过其实并非如此。
libamfx 只支持AMF0不支持AMF3
amf3cplusplus 是国人实现的,仅实现windows平台版本,支持除undefine/xmldoc/xml外其他AMF3数据类型。 可能在一些情况下能满足你的需求。
但我要在unix/linux平台下用, 所以amf3cplusplus不能直接满足我的需求。 c++ rtmp server 里其实已有了AMF3协议的比较全面完善的实现, 不过对于只需要其中的AMF3协议解析部分的人,需要一些把适当的代码抽取出来的工作。
我现在把我抽出来的代码 打包了一下共享出来, 可以帮助其他有需要的人省点功夫。代码采用cmake进行build管理。
其中的VBuffer.h 和VBuffer.cpp 是我加进去的, 不是c++ rtmp server里原来有的。
VBuffer的特点是: 一个VBuffer对象可以attach(挂载)进外部其他地方分配的内存, 所以比较方便和各种网络库结合使用, 不过同一个VBuffer对象,要么只用于连续Read的功能,要么只用于连续Write的功能,若对同一个
VBuffer对象既Read又Write, 则可能会发生混乱。
而与之对比, CRTMPServer的 IOBuffer类(common\src\utils\buffering\iobuffer.h)则是个可同时写和读的缓冲区管理类。我不用它而改用VBuffer主要是因为VBuffer比较方便和其他网络库结合使用的原因。 总的来说c++ rtmp server的代码质量感觉比较高, 它的其他部分有时间也可以研究学习一下.
下面是我结合使用陈硕的muduo网络库 进行AMF3协议解析的一小段例子:
const static size_t kHeaderLen = sizeof(uint32_t)+sizeof(uint32_t);
void GateServer::onMessage(const muduo::net::TcpConnectionPtr& conn,
muduo::net::Buffer* buf,
muduo::Timestamp time)
{
while (buf->readableBytes() >= kHeaderLen)
{
const void* data = buf->peek();
int32_t be32 = *static_cast<const uint32_t*>(data);
const int32_t len = muduo::net::sockets::networkToHost32(be32);
LOG_INFO << conn->name() << "cmd:" << muduo::net::sockets::networkToHost32(cmd) << "length:" << len <<"\n";
if (len > 65536 || len < 0)
{
LOG_ERROR << "Invalid length " << len;
conn->shutdown();
}
else if (buf->readableBytes() >= len+kHeaderLen)
{
buf->retrieve(kHeaderLen);
VBuffer msgbuf(const_cast<char *>(buf->peek()),len);
buf->retrieve(len);
//cout<<msgbuf.GetBuffer()<<msgbuf.GetSize()<<endl;
AMF3Serializer serializer;
Variant var;
serializer.Read(msgbuf,var);
......
}
else{
break;
}
}
}
分享到:
相关推荐
AMF3 C++ AMF3 C++ 源码库码库
AMF3 C++ 源码 修改版 支持序列化和对象化的AMF3解析
amf c# flex服务端协议解析和封装。
AMF3协议中文版定义.pdf
之前测试解析amf3协议数据进行树化便于观察的,解析的有可能不是很完美,正常用来观察里面的数据没什么问题
一个用C++编写的,amf3协议解析模块,可以实现flash通信协议的解析
Adobe宣布将公开实时消息传送协议(Real-Time Messaging Protocol,RTMP)规范,RTMP是设计在Adobe Flash平台技术之间提供高性能音频、视频和数据传输。之前Adobe公开AMF规范就收到了RIA社区不同程度欢迎。 这份源码...
(5G AMF网元标准协议中英文对照版)29518-g00 Access and Mobility Management Services(AMF).docx
《RTMP协议中AMF的定义》,原名《TheAMF》英文版本。 内容简介: The AMF object is used for the sending and receiving of all video/audio data. After the initial handshake, all objects sent use the AMF ...
amf3_spec amf3_spec amf3_spec amf3_spamf3_specec
amf3 的格式说明,英文版,做rtmp协议或者做与flash数据交互服务器端必备的参考
自己写的flash webgame 搭建的java 后台 解决了安全沙箱问题,可以进行聊天,和后台java函数的请求及响应。amf3 编码。
AMF源码 AMF源码欢迎下载
amf3_spec_05_05_08.pdf amf3_spec_05_05_08.pdf amf3_spec_05_05_08.pdf
这实现了几乎所有AMF3功能,但对于长尾负载而言,性能至少提高了一个数量级。 作为“项目的一部分而编写。 安装: npm install node_amf_cc 用法: var amfcc = require('node_amf_cc'); var encoded = amfcc....
Delphi的AMF格式代码。 TAMF3Stream = class(TAMFBaseStream) private type TAMFCache<T> = class private FIndex: Integer; FCache: TDictionary, Integer>; function GetIndex(const Obj: T): Integer; ...
amf0 原版文档 完整版
Action Message Format AMF3中英文对照 本人翻译 Abstract Action Message Format AMF is a compact binary format that is used to serialize ActionScript object graphs Once serialized an AMF encoded object ...
支持AS3的ByteArray序列化对象的AMF格式编码、解码( readObject、writeObject )。 支持AS3的ByteArray的compress、uncompress压缩算法:DEFLATE、LZIB、LZMA。 支持直接修改AS3的ByteArray字节流内编码的对象。 ...
NULL 博文链接:https://leopard0825.iteye.com/blog/644028