Protobuf
首先编写一个proto文件,命名为message.proto
syntax = "proto3"; // 声明了protobuf的版本
package UserMessage;
message Person
{
string name = 1; // 1表示第一个字段
int32 id = 2;
string email = 3;
}
enum PhoneType
{
MOBILE = 0;
HOME = 1;
WORK = 2;
}
message PhoneNumber
{
string number = 1;
PhoneType type = 2;
}
然后通过如下命令编译
protoc message.proto --cpp_out=.
将生成的message.pb.*文件复制到server,和client工程目录下。
Server端
#include <string>
#include <iostream>
#include <windows.h>
#include <zmq.hpp>
#include "pb/message.pb.h"
int main()
{
zmq::context_t context(2);
zmq::socket_t socket(context, zmq::socket_type::rep);
socket.bind("tcp://*:5555");
while (true)
{
//等待用户请求
zmq::message_t request;
socket.recv(request,zmq::recv_flags::none);
std::string recv_str((char*)request.data(),request.size());
UserMessage::Person ps;
ps.ParseFromString(recv_str);
std::cout << "服务端:"<<ps.name()<<" "<<ps.id() << " " << ps.email() << " " << std::endl;
//做些处理
Sleep(1);
//应答world
zmq::message_t reply(5);
memcpy(reply.data(), "World", 5);
socket.send(reply,zmq::send_flags::none);
std::cout << "服务端:回复world" << std::endl;
}
return 0;
}
Client端
/// CS Pattern
#include <zmq.hpp>
#include <string.h>
#include <iostream>
#include <windows.h>
#include "pb/message.pb.h"
int main()
{
zmq::context_t context(1);
zmq::socket_t requester(context, zmq::socket_type::req);
requester.connect("tcp://localhost:5555");
for (int request_nbr = 0; request_nbr != 10; request_nbr++)
{
UserMessage::Person ps;
ps.set_name("zeng");
ps.set_id(130035928481982);
ps.set_email("zeng@qq.com");
std::string ps_string;
ps.SerializeToString(&ps_string);
zmq::message_t request(ps_string.size());
memcpy(request.data(), ps_string.c_str(), ps_string.size());
requester.send(request, zmq::send_flags::none);
std::cout << "客户端:请求数据,"<< request.to_string() << std::endl;
zmq::message_t reply;
requester.recv(reply, zmq::recv_flags::none);
std::cout << "客户端:接受返回数据" << std::endl;
}
}