一、c++实例

1.下载与安装thrift工具

http://thrift.apache.org/download/

、服务端代码

1)、新建vc工程。

2)、将上面的文件拷贝到工程目录下,Test_server.skeleton.cpp,就是C++服务端的main函数入口文件。

// This autogenerated skeleton file illustrates how to build a server.
// You should copy it to another filename to avoid overwriting it.

#include "Test.h"
#include <thrift/protocol/TBinaryProtocol.h>
#include <thrift/server/TSimpleServer.h>
#include <thrift/transport/TServerSocket.h>
#include <thrift/transport/TBufferTransports.h>

using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;

using boost::shared_ptr;

class TestHandler : virtual public TestIf {
 public:
  TestHandler() {
    // Your initialization goes here
	  Init();
  }

  int32_t add(const int32_t a, const int32_t b) {
    // Your implementation goes here
    printf("add\n");
	return a+b;
  }

  void getById(User& _return, const int64_t id) {
    // Your implementation goes here
	User *user;
	std::list<User *>::iterator iter = m_listUser.begin(),iterEnd = m_listUser.end();
	for(iter; iter!=iterEnd; iter++)
	{
		user = *iter;
		if(user->id == id)
		{
			_return.id = user->id;
			_return.__set_name(user->name.c_str());
			_return.age = user->age;
			_return.__set_vip(user->vip);
			break;
		}
	}
	printf("getById\n");
  }

protected:
	void Init(){
		m_listUser.clear();
		int n = 0;
		for(n=0; n<10; n++){
			User * user = new User();
			user->id = n+1;
			user->age = 18+n;
			sprintf((char *)user->name.data(),"name_%d",n+1);
			//插入
			m_listUser.push_back(user);
		}

	}
	std::list<User *> m_listUser;
};

int main(int argc, char **argv) {
  int port = 9090;
  shared_ptr<TestHandler> handler(new TestHandler());
  shared_ptr<TProcessor> processor(new TestProcessor(handler));
  shared_ptr<TServerTransport> serverTransport(new TServerSocket(port));
  shared_ptr<TTransportFactory> transportFactory(new TBufferedTransportFactory());
  shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());

  TSimpleServer server(processor, serverTransport, transportFactory, protocolFactory);
  server.serve();
  return 0;
}

//需要引入thrift对于cpp的lib头文件所在目录,openssl头文件所在目录,boost头文件所在目录。

//需要引用lib文件,LibThrift.lib libeay32MT.libssleay32MT.lib

5、客户端代码

1)、新建vc工程。

2)、将上面的文件(除Test_server.skeleton.cpp外)拷贝到工程目录下。

3)、编写客户端代码。

// Client.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
#include <thrift/transport/TSocket.h>
#include <thrift/transport/TBufferTransports.h>
#include <thrift/protocol/TBinaryProtocol.h>
#include "Test.h"

using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;

using boost::shared_ptr;
using namespace std;

int main(int argc, char* argv[])
{
	boost::shared_ptr<TSocket> socket(new TSocket("localhost", 9090));
	//对接nonblockingServer时必须的,对普通server端时用boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));
	//boost::shared_ptr<TTransport> transport(new TFramedTransport(socket));
	boost::shared_ptr<TTransport> transport(new TBufferedTransport(socket));

	boost::shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
	TestClient client(protocol);

	try
	{
		//设置发送、接收、连接超时
		socket->setConnTimeout(5000);
		socket->setRecvTimeout(5000);
		socket->setSendTimeout(5000);

		transport->open();

		//insert your code here
		int nResult = client.add(100,200);
		printf("add(%d,%d) = %d\n",100,200,nResult);
		User findUser;
		findUser.id = -100;
		client.getById(findUser,1);
		printf("%s\n",findUser.name.c_str());

		transport->close();

		printf("send success!\n");
	}
	catch (...)
	{
	}

	return 0;
}

//需要引入thrift对于cpp的lib头文件所在目录,openssl头文件所在目录。

//需要引用lib文件,LibThrift.lib libeay32MT.libssleay32MT.lib

二、VS2008上编译thrift的库文件

1、下载thrift-0.9.3.tar.gz源码,源码针对cpp的编译自带的是vs2010版本。

2、需要第三方库boost、libevent、openssl支持。

libevent-2.0.21-stable.tar.gzhttps://github.com/downloads/libevent/libevent/libevent-2.0.21-stable.tar.gz

boost 1.54.0

http://www.boost.org/users/history/version_1_54_0.html

编译好的boost 1.54.0下载地址:https://sourceforge.net/projects/boost/files/boost-binaries/1.54.0

OpenSSL 1.0.0g

VC2008下使用OpenSSL 1.0.0g(免编译)

http://blog.csdn.net/akof1314/article/details/7241829

3、新建vc工程,编译。

用Project From Existing Code...创建工程。
将 cpp/src/thrift加入工程,修改项目配置类型修改成静态库。
在Solution Explorer中,
去除 qt目录。
添加 boost包含目录、openssl所包含目录。
添加 src为包含目录,不然 #include <thrift/Thrift.h>出错。
VC2008缺少 stdint.h,创建到thrift/windows目录下,并添加为include目录。
#pragma once

#include <boost/cstdint.hpp>

typedef boost::int8_t int8_t;

typedef boost::uint8_t uint8_t;

typedef boost::int16_t int16_t;

typedef boost::uint16_t uint16_t;

typedef boost::int32_t int32_t;

typedef boost::uint32_t uint32_t;

typedef boost::int64_t int64_t;

typedef boost::uint64_t uint64_t;

#define INT8_MIN    ((int8_t)_I8_MIN)

#define INT8_MAX    _I8_MAX

#define INT16_MIN   ((int16_t)_I16_MIN)

#define INT16_MAX   _I16_MAX

#define INT32_MIN   ((int32_t)_I32_MIN)

#define INT32_MAX   _I32_MAX

#define INT64_MIN   ((int64_t)_I64_MIN)

#define INT64_MAX   _I64_MAX

#define UINT8_MAX   _UI8_MAX

#define UINT16_MAX  _UI16_MAX

#define UINT32_MAX  _UI32_MAX

#define UINT64_MAX  _UI64_MAX

去除VC2010 thrift.sln中没有的文件,无法编译:
Mutex.cpp, PosixThreadFactory.cpp, Monitor.cpp
TEvhttpClientChannel.cpp TEvhttpServer.cpp
TServer.cpp TNonblockingServer.cpp
TSSLSocket.cpp TSSLServerSocket.cpp
TZlibTransport.cpp

加上宏 HAVE_CONFIG_H,或者 force include force_inc.h.
windows/tr1/functional中
#include <functional>
改为
#include <boost/tr1/functional.hpp>


Thrift之c++实例的更多相关文章

  1. Thrift-java实例

    ➠更多技术干货请戳:听云博客 Thrift实例1 功能描述:客户端与服务器端分别是两个应用,先启动服务器端,再启动客户端,实现执行客户端运行服务器端的加法方法. 源码截图(源码在附件中): 客户端: ...

  2. Thrift之java实例

    一.java实例 1.下载与安装thrift工具 http://thrift.apache.org/download/ .服务器代码 服务Test实现类 package com.zychen.thri ...

  3. Thrift全面介绍

    官网:http://thrift.apache.org   简介 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java ...

  4. thrift常见异常及原因分析(updating)

    [org.apache.thrift.TException家族] [Thrift架构] 以下是thrift的客户端和服务端交互的一个原理图.可以看到遵循了rpc框架的传输层.协议层和应用层三层.本文提 ...

  5. Thrift初试

    Restful 基于 Http 进行通讯. 开放.标准.简单.兼容性升级容易: 性能略低.在 QPS 高或者对响应时间要求苛刻的服务上,可以用 RPC,RPC采用二进制传输.TCP 通讯,所以通常性能 ...

  6. python thrift 实现 单端口多服务的过程

    Thrift 是一种接口描述语言和二进制通信协议.以前也没接触过,最近有个项目需要建立自动化测试,这个项目之间的微服务都是通过 Thrift 进行通信的,然后写自动化脚本之前研究了一下. 需要定义一个 ...

  7. 北风风hadoop课程体系

    课程一.基于Linux操作系统平台下的Java语言开发(20课时)课程简介本套课程主要介绍了Linux系统下的Java环境搭建及最基础的Java语法知识.学习Linux操作系统下Java语言开发的好处 ...

  8. Python代码样例列表

    扫描左上角二维码,关注公众账号 数字货币量化投资,回复“1279”,获取以下600个Python经典例子源码 ├─algorithm│       Python用户推荐系统曼哈顿算法实现.py│    ...

  9. Hive 官方手册翻译 -- Hive Transactions (Hive 事务)

    由 Alan Gates创建, 最终由 Andrew Sherman修改于2018年8月7日 原文链接:https://cwiki.apache.org/confluence/display/Hive ...

随机推荐

  1. go——数组

    数组(array)就是由若干个相同类型的元素组成的序列. var ipv4 [4]uint8 = [4]uint8(192,168,0,1) 在这条赋值语句中,我们为刚声明的变量ipv4赋值.在这种情 ...

  2. Javascript中call()和apply()的用法 ----2

    前言 call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向.call 和 apply二者的作用完全一样,只是接受 ...

  3. HDU4628

    /*状态转移f[i]=min(f[i],f[j]+f[i^j]); 就是j状态+i^j状态=i状态,f[i]记录的是从i删除1要的最小步数*/ #include<string.h> #in ...

  4. 微软名人数据集 ms_celeb_1m 处理(MsCelebV1-Faces-Aligned.tsv)python脚本

    本文主要介绍了如何对MsCelebV1-Faces-Aligned.tsv文件进行提取 原创by南山南北秋悲 欢迎引用!请注明原地址 http://www.cnblogs.com/hwd9654/p/ ...

  5. Python3.x:日期库dateutil简介

    Python3.x:日期库dateutil简介 安装 pip install python-dateutil 关于parser #字符串可以很随意,可以用时间日期的英文单词,可以用横线.逗号.空格等做 ...

  6. Mysql 忘记密码处理配置

    Mysql忘记密码处理 1.设置mysql密码 mysqladmin -uroot password ‘密码’ 2.主配置文件下取消密码授权 vim /etc/my.cnf 注:加入skip-gran ...

  7. Oracle数据库使用总结

    --1.使用月份作为条件筛选(to_char函数与extract函数使用) select * from test_date where to_char(dqsj,'mm') like '%07%'; ...

  8. Linux系统基本的内存管理知识讲解

    内存是Linux内核所管理的最重要的资源之一.内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量.虚拟内存就是为了克服这个矛盾而采用的策略.系统的虚拟内存通过在各个 ...

  9. Spring 模块

  10. Graph_Master(连通分量_B_Trajan+完全图)

    hdu_4635 题目大意:给出一张DAG(n个点,m条边),求出能加的最大边数,使得该图无重边,无自环,非强连通. 题解:这题题面很好理解,也没有什么很难的点,主要是如何求出最大边数需要动点脑筋.首 ...