关闭

一个thrift实例

128人阅读 评论(0) 收藏 举报

原文地址:https://my.oschina.net/zmlblog/blog/177245


1. 编写thrift接口文件student.thrift 


struct Student{
 1: i32 sno,
 2: string sname,
 3: bool ssex,
 4: i16 sage,
}
service Serv{
 i32 put(1: Student s),
}


2. 用“thrift -r --gen cpp student.thrift”在gen-cpp文件夹中生成cpp及头文件,其中自动生成了Serv_server.skeleton.cpp文件,它是简单的server端代码,可以修改(一般都重新参照来写server端代码)。 
可以用
g++ -g -DHAVE_NETINET_IN_H -I. -I/usr/local/include/thrift -L/usr/local/lib Serv.cpp student_types.cpp student_constants.cpp Serv_server.skeleton.cpp -o server -lthrift 
生成server可执行程序; 


3. 可以修改Serv_server.skeleton.cpp文件,做成非阻塞server: 
    新建server.cpp文件(参照Serv_server.skeleton.cpp并参照nonblockingServer的写法): 


#include <concurrency/ThreadManager.h> //zml
#include <concurrency/PosixThreadFactory.h> //zml
#include "Serv.h"
#include <protocol/TBinaryProtocol.h>
#include <server/TSimpleServer.h>
#include <transport/TServerSocket.h>
#include <transport/TBufferTransports.h>
#include <server/TNonblockingServer.h> //zml    
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;    
using namespace::apache::thrift::concurrency; //zml        
using boost::shared_ptr;


#define THREAD_NUM 2
const int g_port = 9090;
class ServHandler : virtual public ServIf {
 public:
  ServHandler() {
// Your initialization goes here
  }
  int32_t put(const Student& s) {
// Your implementation goes here
printf("put student.sno=%d\n", s.sno);
return s.sno;
  }
};
int thrift_server_run()
{
//创建thrift server
shared_ptr<ServHandler> handler(new ServHandler());
shared_ptr<TProcessor> processor(new ServProcessor(handler));
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());

shared_ptr<ThreadManager> threadManager = ThreadManager::newSimpleThreadManager(THREAD_NUM);
shared_ptr<PosixThreadFactory> threadFactory = shared_ptr<PosixThreadFactory> (new PosixThreadFactory()); //PosixThreadFactory可以自定义(继承于ThreadFactory)
threadManager->threadFactory(threadFactory);
threadManager->start();
TNonblockingServer server(processor, protocolFactory, g_port, threadManager);
try {
server.serve();
}
catch(TException e) {
printf("Server.serve() failed\n");
exit(-1);
}
return 0;
}
int main(int argc, char **argv) {
thrift_server_run();
while(1) {
sleep(10);
}
return 0;
}
    
    生成server可执行程序: 
    g++ -g -DHAVE_NETINET_IN_H -I. -I/usr/local/include/thrift -L/usr/local/lib Serv.cpp student_types.cpp student_constants.cpp server.cpp -o server -lthriftnb -levent -lthrift -lrt 


4. 编写对接nonblockingServer的client端代码: 


#include "Serv.h"  // 替换成你的.h  
#include <transport/TSocket.h>
#include <transport/TBufferTransports.h>
#include <protocol/TBinaryProtocol.h>
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
using boost::shared_ptr;
int main()
{
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<TProtocol> protocol(new TBinaryProtocol(transport));
ServClient client(protocol);

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

transport->open();

//insert your code here  
Student stu;
stu.sno = 1;
stu.sname = "zml";
stu.ssex = 0;
stu.sage = 25;
int ret = client.put(stu);
printf("client put ret=%d\n", ret);

transport->close();
return 0;
}
    
    编译生成client可执行程序: 
    g++ -g -DHAVE_NETINET_IN_H -I/usr/local/include/thrift -L/usr/local/lib/ Serv.cpp student_types.cpp student_constants.cpp client.cpp -o client -lpthread -lthrift -lrt

0
0
查看评论

Thrift 实例 Helloworld

参考资料: thrift.apache.org http://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/ http://mingxiao2010.blog.163.com/blog/static/86190481201142738...
  • hgd250
  • hgd250
  • 2012-12-13 16:42
  • 7411

Thrift入门及Java实例

一、概述 Thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发。它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, S...
  • LK10207160511
  • LK10207160511
  • 2016-01-03 11:15
  • 10717

Thrift 原理与使用实例

一、Thrift 框架介绍 1、前言 Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目。Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型,然后通过一个编译器生成不同语言的代码(目前支持C+...
  • z69183787
  • z69183787
  • 2016-05-06 16:54
  • 1623

Thrift第一个示例

第一步:引入thrift依赖包compile group: 'org.apache.thrift', name: 'libthrift', version: '0.9.3'第二步:创建配置文件HelloService.thrift// 定义命名空间 n...
  • u010397369
  • u010397369
  • 2017-05-04 15:38
  • 304

thrift使用实例

thrift是一个RPC框架,最初由Facebook开发,后来移交apache组织管理。这里用thrift写了一个最简单的例子,服务器和客户端都用java,供大家参考。 0. 下载thrift 首先需要下载thrift编译器,它把thrift定义编译成对应语言。在thrift官网上有下载...
  • HMSIWTV
  • HMSIWTV
  • 2015-07-06 17:57
  • 1982

用C++编写thrift第一个例子

Table of Contents1. 创建thrift文件2. 生成C++代码3. 编写C++客户端代码4. 例子项目4.1. 项目目录4.2. 编译服务端4.3. 编译客户端4.4. 运行1 创建thrift文件thrift文件非常简单,一个WorkerManager提供了一个ping...
  • sheismylife
  • sheismylife
  • 2015-12-15 18:19
  • 5937

Thrift之c++实例

Thrift之c++实例
  • byxdaz
  • byxdaz
  • 2017-07-05 18:55
  • 2479

--总结加一个完整的可运行的Thrift例子

 (八)--总结加一个完整的可运行的Thrift例子 前面七篇文章分析了Thrfit的方方面面,看到这里时应该对Thrift有了深入的理解。 Thrift源码分析(一)-- 基本概念 Thrift源码分析(二)-- 协议和编解码 Thrift源码分析(三)-- ID...
  • linuxarmsummary
  • linuxarmsummary
  • 2017-05-13 23:22
  • 397

thrift一个例子

我用的是c++,所以我举一个c++的例子,简单说一下thrift的使用入门。例子描述是这样的:我们将学生信息(学号,姓名,性别,年龄)由客户端发送到服务端。实现这个例子,我们大致要做以下几部分事情:(1)书写.thrift文件(2)生成cpp文件(3)编写客户端(4)编译cpp文件并执行 ...
  • hbuxiaoshe
  • hbuxiaoshe
  • 2011-06-21 12:47
  • 24277

分享下我学习Thrift的入门例子helloworld,客户端用php,服务端用python:

分享下我学习Thrift的入门例子helloworld,客户端用php,服务端用python: 架构图: 系统环境: Centos 5.6 一、安装Thrift # yum -y install openssl-devel automake libtool flex bison ...
  • kc87654321
  • kc87654321
  • 2012-02-01 21:07
  • 8149
    个人资料
    • 访问:28613次
    • 积分:928
    • 等级:
    • 排名:千里之外
    • 原创:68篇
    • 转载:17篇
    • 译文:0篇
    • 评论:3条
    最新评论