//客户端
#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;
}