国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

網(wǎng)站建設 軟件開發(fā)的公司排名晚上國網(wǎng)app

網(wǎng)站建設 軟件開發(fā)的公司排名,晚上國網(wǎng)app,深圳網(wǎng)深圳網(wǎng)站開發(fā)公司,網(wǎng)站焦點圖怎么做環(huán)境搭建 Protobuf 還常?于通訊協(xié)議、服務端數(shù)據(jù)交換場景。 因為我們主要目的只是為了學習protobuf,因此對于客戶端,原本應該具備: 新增?個聯(lián)系? ? 刪除?個聯(lián)系? ? 查詢通訊錄列表 ? 查詢?個聯(lián)系?的詳細信息 這樣四個功能。 …

環(huán)境搭建

Protobuf 還常?于通訊協(xié)議、服務端數(shù)據(jù)交換場景。
因為我們主要目的只是為了學習protobuf,因此對于客戶端,原本應該具備:
新增?個聯(lián)系?
?
刪除?個聯(lián)系?
?
查詢通訊錄列表
?
查詢?個聯(lián)系?的詳細信息

這樣四個功能。

但是在這里我們只實現(xiàn)新增聯(lián)系人的功能。

對于服務器端,我們同樣應該具備增刪改查的功能,這里我們也只實現(xiàn)增的功能。

這里我們需要用到一個Httplib庫:

cpp-httplib 是個開源的庫,是?個c++封裝的http庫,使?這個庫可以在linux、
windows平臺下完成http客?端、http服務端的搭建。使?起來?常?便,只需要包含頭?件
httplib.h 即可。編譯程序時,需要帶上 -lpthread 選項。

雙方通信的流程?

約定雙方交互req/rsp

base_response.proto
syntax = "proto3";
package base_response;message BaseResponse
{bool succes = 1;    // 返回結果string error_desc = 2; // 狀態(tài)碼
}

add_contact_request.proto

syntax = "proto3";
package add_contact_request;message AddContactRequest
{string name = 1; // 姓名int32 age = 2; // 年齡message Phone{string number = 1;enum PhoneType{MP = 0; // 移動電話TEL = 1; // 固定電話}PhoneType type = 2; // 電話類型}repeated Phone phone_numbers = 3; // 電話號碼map<string,string> remark = 4; // 備注
}

add_contact_response.proto

syntax = "proto3";
package add_contact_response;
import "base_response.proto"; // 引入base_responsemessage AddContactResponse 
{base_response.BaseResponse base_resp = 1;string uid = 2; // 聯(lián)系人的uid
}

客戶端部分:
?

定義一個異常類,用于拋異常:
ContactException.h

#pragma once#include <iostream>class ContactException
{
private:std::string message;
public:ContactException(std::string str = "A Problem") : message(str) {}std::string What() const { return message; }
};

?client.cc

#include <iostream>
#include "../add_contact_request.pb.h"
#include "../add_contact_response.pb.h"
#include "../../cpp-httplib/httplib.h"
#include "ContactException.h"using namespace std;
using namespace httplib;
using namespace add_contact_request;
using namespace add_contact_response;const string IP = "127.0.0.1";
const uint16_t PORT = 8080;void addContact();void menu()
{cout << "----------------網(wǎng)絡通訊錄------------------" << endl;cout << "選擇: 1.添加聯(lián)系人  2. 刪除聯(lián)系人  3.查找所有聯(lián)系人  4. 查找一個聯(lián)系人  0.退出" << endl;
}void addContact()
{httplib::Client cli(IP, PORT);AddContactRequest info;cout << "------------添加聯(lián)系人-------------" << endl;cout << "請輸入聯(lián)系人姓名: " << endl;string name;getline(cin, name);info.set_name(name);cout << "請輸入聯(lián)系人年齡: " << endl;int32_t age;cin >> age;cin.ignore(256, '\n'); // 清空一下緩沖區(qū)// info->set_age(age);string numbers;for (int i = 1;; ++i){cout << "請輸入聯(lián)系人的第" << i << "個號碼(直接回車終止輸入)" << endl;getline(cin, numbers);if (numbers.empty())break;cout << "請輸入這個電話的類型(1/移動電話 2/固定電話): " << endl;int num = 0;cin >> num;cin.ignore(256, '\n'); // 清空以下緩沖區(qū)add_contact_request::AddContactRequest_Phone *phone = info.add_phone_numbers();phone->set_number(numbers); // info->add_phones()返回的是一塊開辟好空間的地址// 為了代碼的可擴展性,這里使用switch而不是if語句switch (num){case 1:phone->set_type(add_contact_request::AddContactRequest_Phone_PhoneType::AddContactRequest_Phone_PhoneType_MP);break;case 2:phone->set_type(add_contact_request::AddContactRequest_Phone_PhoneType::AddContactRequest_Phone_PhoneType_TEL);break;default:cout << "選擇有誤,取默認類型" << endl;break;}}for (int i = 1;; ++i){cout << "請輸入備注" << i << "標題(直接回車退出輸入)" << endl;string remark_key;getline(cin, remark_key);if (remark_key.empty())break;cout << "請輸入備注" << i << "內容" << endl;string remark_val;getline(cin, remark_val);info.mutable_remark()->insert({remark_key, remark_val});}string str_req;if (!info.SerializePartialToString(&str_req)){// 失敗拋異常ContactException e("str_req序列化失敗!");throw(e);}// 發(fā)起Post請求auto res = cli.Post("/contacts/add", str_req, "application/protobuf");if (!res){// 失敗拋異常string str_error = "發(fā)起post請求失敗,錯誤類型: ";str_error += httplib::to_string(res.error());ContactException e(str_error);throw(e);}// 反序列化responseAddContactResponse resp;bool parse = resp.ParseFromString(res->body);if(res->status != 200 && !parse){string err_desc;err_desc += "post contact/add 失敗: ";err_desc += std::to_string(res->status);err_desc += "(";err_desc += res->reason;err_desc += ")";throw ContactException(err_desc);}else if(res->status != 200){string err_desc;err_desc += "post contact/add 失敗: ";err_desc += std::to_string(res->status);err_desc += "(";err_desc += res->reason;err_desc += ")";err_desc += resp.base_resp().error_desc();throw ContactException(err_desc);}else if(!parse){string err_desc;err_desc += "post contact/add 反序列化失敗: ";err_desc += resp.base_resp().error_desc();throw ContactException(err_desc);}cout << "新增聯(lián)系人成功,uid = " << resp.uid() << endl;
}int main()
{while (true){menu();int choose;cin >> choose;cin.ignore(256, '\n');try{switch (choose){case 1:addContact();break;case 2:case 3:case 4:break;case 0:cout << "程序退出" << endl;exit(0);default:cout << "選擇有誤" << endl;exit(-1);break;}}catch (const ContactException &e){cerr << "捕獲一個異常:操作通訊錄時!" << endl;cerr << "信息: " << e.What() << endl;}}return 0;
}

makefile:
?

all:client
client:g++ client.cc ../add_contact_request.pb.cc ../add_contact_response.pb.cc ../base_response.pb.cc -o client -std=c++11 -lpthread -lprotobuf.PHONY:clean
clean:rm -f client

?

服務器部分:
?

這里為了簡單,偷個懶,沒有使用異常了,程序出錯就直接退出

server.cc

#include <iostream>
#include <random>
#include "../../cpp-httplib/httplib.h"
#include "../add_contact_request.pb.h"
#include "../add_contact_response.pb.h"using namespace std;
using namespace httplib;
using namespace add_contact_request;
using namespace add_contact_response;static unsigned int random_char()
{// ?于隨機數(shù)引擎獲得隨機種?std::random_device rd;// mt19937是c++11新特性,它是?種隨機數(shù)算法,?法與rand()函數(shù)類似,但是mt19937// 具有速度快,周期?的特點//  作?是?成偽隨機數(shù)std::mt19937 gen(rd());// 隨機?成?個整數(shù)i 范圍[0, 255]std::uniform_int_distribution<> dis(0, 255);return dis(gen);
}
// ?成 UUID (通?唯?標識符)
static std::string generate_hex(const unsigned int len)
{std::stringstream ss;// ?成 len 個16進制隨機數(shù),將其拼接?成for (auto i = 0; i < len; i++){const auto rc = random_char();std::stringstream hexstream;hexstream << std::hex << rc;auto hex = hexstream.str();ss << (hex.length() < 2 ? '0' + hex : hex);}return ss.str();
}void PrintPeopelInfo(const AddContactRequest &people_info)
{cout << "-----------新增聯(lián)系人信息---------------" << endl;cout << "姓名: " << people_info.name() << endl;// cout << "年齡: " << people_info.age() << endl;// 打印電話for (int j = 0; j < people_info.phone_numbers().size(); ++j){const add_contact_request::AddContactRequest_Phone &phones = people_info.phone_numbers(j);cout << "第" << j + 1 << "個電話: " << phones.number();int num = phones.type();switch (num){case add_contact_request::AddContactRequest_Phone::PhoneType::AddContactRequest_Phone_PhoneType_MP:cout << "(移動電話MP)" << endl;break;case add_contact_request::AddContactRequest_Phone::PhoneType::AddContactRequest_Phone_PhoneType_TEL:cout << "(固定電話TEL)" << endl;break;default:cerr << "未知類型" << endl;break;}}// 打印備注信息int count = 1;for (auto &pair : people_info.remark()){cout << "備注信息" << count++ << ": ";cout << "(" << pair.first << ") : " << pair.second << endl;;}// 打印未知字段const google::protobuf::Reflection *reflection = people_info.GetReflection();const google::protobuf::UnknownFieldSet &unknown_field_set = reflection->GetUnknownFields(people_info);for (int j = 0; j < unknown_field_set.field_count(); ++j){const google::protobuf::UnknownField &unknown_field = unknown_field_set.field(j);cout << "未知字段" << j + 1<< " 字段編號: " << unknown_field.number()<< " 字段類型: " << unknown_field.type();switch (unknown_field.type()){case google::protobuf::UnknownField::Type::TYPE_VARINT:cout << " 值: " << unknown_field.varint() << endl;break;case google::protobuf::UnknownField::Type::TYPE_LENGTH_DELIMITED:cout << " 值: " << unknown_field.length_delimited() << endl;break;default:cout << "未知" << endl;break;}}cout << "新增聯(lián)系人成功" << endl;
}int main()
{cout << "----------服務器啟動!----------" << endl;httplib::Server svr;// 先設置方法,再進行監(jiān)聽svr.Post("/contacts/add", [](const Request &req, Response &resp){AddContactRequest contact_req;string str_req;if (!contact_req.ParseFromString(req.body)){cerr << "/contacts/add Post,反序列化失敗!" << endl;exit(-1);}PrintPeopelInfo(contact_req); // 打印新增聯(lián)系人信息// 準備響應信息// 這里為了簡單就硬編碼設置了AddContactResponse contact_resp;contact_resp.set_uid(generate_hex(8));string str_resp;if(!contact_resp.SerializePartialToString(&str_resp)){cerr << "序列化響應信息失敗,程序退出!" << endl;exit(-1);}resp.status = 200;resp.body = str_resp;resp.set_header("Content-Type", "application/protobuf");cout << "響應構建成功,準備發(fā)送!" << endl;});svr.listen("0.0.0.0",8080);return 0;
}

在上述過程中,設計了一個能隨機生成uid的函數(shù),可以了解一下。

makefile:

all:server
server:g++ server.cc ../add_contact_request.pb.cc ../add_contact_response.pb.cc ../base_response.pb.cc -o server -std=c++11 -lpthread -lprotobuf.PHONY:clean
clean:rm -f server

?演示效果:

客戶端的新增聯(lián)系人功能:

這里也簡化了對服務器發(fā)送過來的響應的處理,我們只打印了服務器給我們返回的聯(lián)系人的uid

服務器端的新增聯(lián)系人功能:

?

服務器受到信息后,就會對客戶端那邊設置的信息進行一個打印,然后把生成的uid發(fā)送給客戶端

總結:ProtoBuf的性能與使用場景

1. XML、JSON、ProtoBuf 都具有數(shù)據(jù)結構化和數(shù)據(jù)序列化的能?。
2. XML、JSON 更注重數(shù)據(jù)結構化,關注可讀性和語義表達能?。ProtoBuf 更注重數(shù)據(jù)序列化,關注 效率、空間、速度,可讀性差,語義表達能?不?,為保證極致的效率,會舍棄?部分元信息。
3. ProtoBuf 的應?場景更為明確, 適合?性能,對響應 速度有要求的數(shù)據(jù)傳 輸場景。

XML、JSON 的應?場景更為豐富。

?

?

?

http://aloenet.com.cn/news/43569.html

相關文章:

  • 一級a做愛視頻網(wǎng)站互聯(lián)網(wǎng)推廣方案
  • 簡約創(chuàng)意情人節(jié)海報設計seo關鍵詞優(yōu)化公司哪家好
  • 空間印象商業(yè)空間設計seo公司費用
  • 建站員工網(wǎng)站推廣公司品牌
  • 網(wǎng)站有什么seo在線優(yōu)化工具
  • 邪惡做動態(tài)網(wǎng)站百度小說風云榜
  • 濟南建設網(wǎng)站的公司seo快速培訓
  • 做網(wǎng)站會用到的代碼單詞有沒有免費的crm系統(tǒng)軟件
  • 網(wǎng)站集約化平臺青島seo排名公司
  • wordpress變數(shù)據(jù)庫seo推廣優(yōu)化官網(wǎng)
  • 河南省建設廳網(wǎng)站人事網(wǎng)滎陽seo
  • 門戶網(wǎng)站建設自評報告seo營銷是什么
  • 門戶網(wǎng)站建設中存在的問題刷贊網(wǎng)站推廣永久
  • 東城手機網(wǎng)站制作佛山全市核酸檢測
  • 域名??烤W(wǎng)站什么是關鍵詞搜索
  • 做網(wǎng)站 做手機app要學什么軟件競價托管多少錢
  • 美國免費建站平臺東莞優(yōu)化排名推廣
  • 做塑料的網(wǎng)站名字國內比百度好的搜索引擎
  • 電腦怎樣做病毒網(wǎng)站成都十大營銷策劃公司
  • 長沙做網(wǎng)站最好的公司win7優(yōu)化大師官方網(wǎng)站
  • 云南網(wǎng)站搭建網(wǎng)站怎么優(yōu)化關鍵詞排名
  • 網(wǎng)站導航漂浮代碼整合營銷傳播方案
  • java做的網(wǎng)站源碼seo發(fā)包技術教程
  • 05網(wǎng)站網(wǎng)上哪里可以免費打廣告
  • 化妝品網(wǎng)站靜態(tài)模板適合中層管理的培訓
  • 長沙做網(wǎng)站微聯(lián)訊點靠譜推廣什么app傭金高
  • 南昌網(wǎng)站建設制作網(wǎng)絡推廣接單平臺
  • 廣州制作網(wǎng)站的公司互聯(lián)網(wǎng)推廣怎么找渠道
  • 國外html5特效網(wǎng)站深圳seo秘籍
  • 買香港空間上傳美女圖片做網(wǎng)站互聯(lián)網(wǎng)營銷師培訓