应用层自定义协议与序列化

关于协议

在了解UDP和TCP的代码后,我们发现,我们想传输数据,都是按照字符串的形式发送,然后根据识别字符串得到相应信息,但如果我们想传输结构化的数据该怎么办呢?

如果我们双方约定一种协议,规定该结构中每一个字段分别代表什么意思,然后把相应数据打包成结构体然后传输给对方,对方收到后再依次解开获取各个信息即可。因此协议就是双方约定好的结构化的数据。

这里存在一个问题,我们是否可以直接把结构体发送给对方?不可以,如果两个机器不同,可能会导致发送和收到的信息不一致。因此我们需要做一下改进。

序列化与反序列化

如果我们规定,在发送时按照一定规则把结构体转换成字符串,然后收到字符串时再按照相应的规则转换回去,即可保证信息的准确性,这个过程就为序列化。把字符串反向转换称为反序列化。

为什么要有序列化?------把信息多变一,方便网络发送。

无论采用什么方案,只要保证,一端发送时构造的数据, 在另一端能够正确的进行解析,就是ok的.这种约定,就是应用层协议。上述转换成字符串的"协议"已是被广泛运用的。

利用TCP+网络制定网络计算器

tcp和网络部分我们已经掌握,关键在于定好协议与加入序列化和反序列化的方案。

初步想法:在客户端封装一个请求类,有两个整数和一个char类型的运算符,在服务器端封装一个回应类,有一个结果和一个错误码(用于记录计算情况)。

序列化的方案:1.自己做,把结构体所有都转换成字符串传输。2.前人栽树,我们乘凉,用现有的方案,比如xml、json、protobuf等,为了增加可读性,我们选择json。即把我们的结构化数据转换成json方案的字符串。

同时,为了保证面向字节流下收取数据的完整性,我们在json串前加一个串的长度+\n作为报头,当读取完长度headlength即可读取整个报文不会造成数据丢失问题。

关于如何利用json进行序列化与反序列化,在这里给一份demo代码即可,如果需要的话让大模型生成即可。

cpp 复制代码
bool Serialize(std::string &out_string)//序列化
    {
        Json::Value root;
        root["x"] = _x;
        root["y"] = _y;
        root["oper"] = _oper;
        Json::StreamWriterBuilder wb;
        std::unique_ptr<Json::StreamWriter> w(wb.newStreamWriter());
        std::stringstream ss;
        w->write(root, &ss);
        out_string = ss.str();
        return true;
    }
    bool Deserialize(std::string &in_string)//反序列化
    {
        Json::Value root;
        Json::Reader reader;
        bool parsingSuccessful = reader.parse(in_string, root);
        if (!parsingSuccessful)
        {
            std::cout << "Failed to parse JSON\n";
            return false;
        }
        _x = root["x"].asInt();
        _y = root["y"].asInt();
        _oper = root["oper"].asInt();
        return true;
    }
相关推荐
国际云,接待几秒前
出海东南亚无忧:腾讯云如何凭借本地合作与全球节点,保障游戏和电商业务合规流畅?
大数据·服务器·网络·云计算·腾讯云
一匹电信狗1 小时前
【C++】哈希表详解(开放定址法+哈希桶)
服务器·c++·leetcode·小程序·stl·哈希算法·散列表
2501_929907001 小时前
怕随身 WiFi 虚量断连?格行随身wifi拆箱测评:1500G 真不虚标?
网络
路由侠内网穿透.1 小时前
本地部署网站流量分析工具 Matomo 并实现外部访问
运维·服务器·远程工作
极客范儿2 小时前
华为HCIP网络工程师认证—网络参考模型
网络·华为
dnpao2 小时前
在服务器已有目录中部署 Git 仓库
运维·服务器·git
南♡黎(・ิϖ・ิ)っ2 小时前
JavaEE初阶,网络原理HTTP报头篇
网络·https·java-ee
冰糖拌面2 小时前
GO写的http服务,清空cookie
服务器·http·golang
爱编程的鱼2 小时前
HTTP 是什么?它是如何工作的
网络·网络协议·http
超越自己2 小时前
远程连接银河麒麟服务器-xrdp方式
linux·运维·服务器·远程桌面·银河麒麟