c++ zeromq 和 Protocol Buffers 结合例子

//客户端
#include "stdafx.h"
#include <zmq.h>
#include "test.pb.h"
#include <fstream>
using namespace  std;

/*

1、test.proto 文件

syntax = "proto2";

message Example1 {
required bool boolVal = 1;
optional string name =2;
repeated int32 phone = 3;

}


2、protoc.exe -I=. --cpp_out=./ test.proto

生成 test.pb.h test.pb.cpp

*/
int _tmain(int argc, _TCHAR* argv[])
{
	void *pContext = zmq_ctx_new ();
	printf ("正在连接至hello world服务端...\n");
	void *requester = zmq_socket (pContext, ZMQ_REQ);
	zmq_connect (requester, "tcp://localhost:5555");
	Example1 exp1Tmp;
	exp1Tmp.set_boolval(false);
	exp1Tmp.set_name("j");
	for (int i =0; i< 5; i++)
	{
		exp1Tmp.add_phone(i);
	}
	
	int nByte = exp1Tmp.ByteSize();
	//exp1Tmp.ParseFromIstream();
	ofstream outfile;
	outfile.open("file.dat", ios::out | ios::trunc );
	bool bIsRet =exp1Tmp.SerializeToOstream(&outfile); //从文件中序列化
	outfile.flush();
	outfile.close();

	std::string sData02 =	exp1Tmp.SerializePartialAsString(); //部分序列化
	std::string sData = exp1Tmp.SerializeAsString();            //全部序列化为字符串
	int nLen = sData.length();
	int request_nbr;
	for (request_nbr = 0; request_nbr != 10; request_nbr++) {
		zmq_msg_t request;
		zmq_msg_init_size (&request, sData.length());
		memcpy (zmq_msg_data (&request), sData.c_str(),sData.length());
		printf ("正在发送: %s\n", sData.data());
		
		size_t intType = zmq_msg_size(&request);
		printf ("zmq_msg_size: %d\n", intType);

		//zmq_msg_send(&request,requester,0);
		zmq_msg_send (&request,requester, 0);
		zmq_msg_close (&request);

		zmq_msg_t reply;
		zmq_msg_init (&reply);
		zmq_recv (requester, &reply, sizeof(zmq_msg_t),0);
		printf ("接收到 World %d\n", request_nbr);
		zmq_msg_close (&reply);
	}
	zmq_close (requester);
	zmq_term (pContext);
	system("pause");

	return 0;
}






//服务端
#include "stdafx.h"
#include <zmq.h>
#include "..\zmqclient\test.pb.h"
#include <iostream>

int _tmain(int argc, _TCHAR* argv[])
{
	int nSizebool = sizeof(bool);
	void *context = zmq_ctx_new ();

    //  与客户端通信的套接字
    void *responder = zmq_socket (context, ZMQ_REP);
	int  nState = zmq_bind (responder, "tcp://*:5555");
	printf("nState: %d\n", nState);
    while (1) {
        //  等待客户端请求
        zmq_msg_t request;
		zmq_msg_init (&request);
		int nTmp = sizeof(zmq_msg_t);
		zmq_msg_init_size (&request, sizeof(zmq_msg_t));
		char msg [256] = {0};
		//int nSize =  zmq_recv (responder, &msg,sizeof(msg),0);
		int nSize = zmq_recvmsg(responder, &request,0);
		
		//size_t  msgSize = zmq_msg_size(&request);
		char *pdata = new char[nSize];
		
		memcpy (pdata, zmq_msg_data(&request), nSize);

		Example1 receive;
		receive.ParseFromArray(pdata,nSize);
		int nPhoneSize = receive.phone_size();
		for (int i= 0; i< nPhoneSize; i++)
		{
			std::cout << receive.phone(i)<<", ";
		}
		std::cout<<"\nbool:"<<receive.boolval()<<"\t"<<"Name:"<<receive.name()<<"\n";

        printf ("收到 Hello %s\n" , pdata);
        zmq_msg_close (&request);

        //  做些“处理”
        Sleep(100);

        //  返回应答
        zmq_msg_t reply;
        zmq_msg_init_size (&reply, 5);
        memcpy (zmq_msg_data (&reply), "World", 5);
        zmq_send (responder, &reply, sizeof(zmq_msg_t), 0);
        zmq_msg_close (&reply);
    }
    //  程序不会运行到这里,以下只是演示我们应该如何结束
    zmq_close (responder);
    zmq_term (context);
	system("pause");

	return 0;
}


 

ZeroMQ是一个开源的消息传递库,它提供了高性能、异步的消息传递模式。它支持多种编程语言,包括C++。 在C++中使用ZeroMQ,你需要下载并安装ZeroMQ库。你可以从ZeroMQ的官方网站(http://zeromq.org)下载最新版本的库,并按照官方文档提供的说明进行安装。 一旦安装完成,你可以在C++代码中包含ZeroMQ的头文件,并链接ZeroMQ库。以下是一个简单的示例代码,演示如何使用ZeroMQ进行消息传递: ```cpp #include <zmq.hpp> #include <string> int main() { // 创建一个ZeroMQ上下文 zmq::context_t context(1); // 创建一个ZeroMQ套接字 zmq::socket_t socket(context, zmq::socket_type::req); // 连接到目标地址 socket.connect("tcp://localhost:5555"); // 发送消息 std::string message = "Hello, ZeroMQ!"; zmq::message_t request(message.size()); memcpy(request.data(), message.data(), message.size()); socket.send(request, zmq::send_flags::none); // 接收回复 zmq::message_t reply; socket.recv(reply, zmq::recv_flags::none); // 处理回复消息 std::string replyMessage(static_cast<char*>(reply.data()), reply.size()); std::cout << "Received reply: " << replyMessage << std::endl; return 0; } ``` 以上代码中,我们创建了一个REQ类型的套接字,并通过connect()方法连接到目标地址。然后,我们发送一条消息并接收回复。 这只是ZeroMQC++中使用的简单示例,你可以根据需要进一步探索ZeroMQ的功能和特性。希望对你有帮助!如果有任何问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值