ubuntu下thrift的安装

摘要:
libfrich-0.8.0.jar和libfrict-0.8.0-javadoc。jar将在lib/java/build目录中生成。节俭-r-genjavatutorial.thrifttirft-r-gencpp教程。Thrift可以通过执行这两个命令生成gen-java和gen-cpp文件夹。这些是Thrift编译器自动生成的代码。然后转到java目录并执行ant命令。编译成功后,在两个不同的窗口中执行以下命令:/JavaServer/JavaClientsimple进入cpp目录并执行make命令。如果发生编译错误,第一个错误是/usr/local/include/hrift/protocol/TBinaryProtocol Tcc:147:35:error:存在依赖于模板参数的“htons”参数,因此“htons”的声明必须可用。修改Makefile并添加编译选项-DRIVE_ NETINET_IN_Hserver:CppServer。cppg++-DHAVE_NETINET_IN_H-oCppServer-I${THRIFT_DIR}-I${BOOST_DIR}-I./gen-cpp-L${LIB_DIR}-lthriftCppServer.cpp${gen_SRC}客户端:CppClient。cppg++-DHAVE_NETINET_IN_H-oCppClient-I${THRIFT_DIR}-I${BOOST_DIR}-I./gen cpp-L${LIB_DIR}-lthreftCppClient。cpp${GEN_SRC}编译后,将生成CppClient和CppServer。

ubuntu下thrift的安装 - 水木米 - 博客频道 - CSDN.NET


分类:
c/c++

2012-08-03 11:17
51人阅读
评论(0)
收藏
举报

1.下载源代码

http://thrift.apache.org/download/
下载最新版本thrift-0.8.0.tar.gz

2.安装boost库
sudo apt-get install libboost-dev libboost-dbg libboost-doc bcp libboost-*
3.安装其他相关工具包
sudo apt-get install libboost-dev libboost-test-dev libboost-program-options-dev libevent-dev automake libtool flex bison pkg-config g++ libssl-dev ant
如果需要支持java,需要安装jdk,配置java环境变量。
4.解压文件,进入目录thrift-0.8.0安装

./configure--with-cpp--with-boost--without-python--without-csharp
--with-java --without-erlang --without-perl --with-php --without-php_extension --without-ruby --without-haskell--without-go

make
sudo make install
要支持java,需要编译生成jar包,到lib/java目录下,执行ant命令。将在lib/java/build目录下生成libthrift-0.8.0.jar和libthrift-0.8.0-javadoc.jar。编译过程中,可能出错,需要检查lib/java/build/tools/maven-ant-tasks-2.1.3.jar是否正确下载。
5.测试
直接输入thrift命令,看是否有用法提示
二、thrift自带的测试样例
进入tutorial文件夹,shared.thrift和tutorial.thrift是接口定义文件。
thrift -r --gen javatutorial.thrift
thirft -r --gen cpptutorial.thrift
执行这两条命令可以生成gen-java和gen-cpp两个文件夹,这些是thrift编译器自动生成的代码。
然后到java目录下,执行ant命令,编译成功后,在两个不同的窗口下执行以下命令:
./JavaServer
./JavaClient simple
进入cpp目录下,执行make命令,如果编译出错,第一个错误是
/usr/local/include/thrift/protocol/TBinaryProtocol.tcc:147:35: error: there are no arguments to ‘htons’ that depend on a template parameter, so a declaration of ‘htons’ must be available
则修改Makefile,加上编译选项-DHAVE_NETINET_IN_H
server: CppServer.cpp
g++-DHAVE_NETINET_IN_H-o CppServer -I${THRIFT_DIR} -I${BOOST_DIR} -I../gen-cpp -L${LIB_DIR} -lthrift CppServer.cpp ${GEN_SRC}
client: CppClient.cpp
g++-DHAVE_NETINET_IN_H-o CppClient -I${THRIFT_DIR} -I${BOOST_DIR} -I../gen-cpp -L${LIB_DIR} -lthrift CppClient.cpp ${GEN_SRC}
编译通过生,将生成CppClient和CppServer两个可执行程序。同样,在两个不同的窗口执行以下命令:
./CppServer
./CppClient
而且java和c++的Client和Server都可以交叉运行。比如运行JavaServer和CppClient也能得到同样的结果。以此达到了多语言的相互调用。
三、Hello World
仿照tutorial,写一个简单的hello world。在tutorial平级目录下,建立目录hello,这里只是为了测试需要。
服务端用java,客户端用java和c++。
1. 编写tt.thrift
namespace java demo
namespace cpp demo
service Hello{
string helloString(1:string para)
}
2. 编译生成代码
thrift -r --gen java tt.thrift
thrift -r --gen cpp tt.thrift
生成gen-java和gen-cpp两个文件夹
gen-cpp下有如下文件
Hello.cpp Hello.h Hello_server.skeleton.cpp tt_constants.cpp tt_constants.h tt_types.cpp tt_types.h
其中Hello.h,Hello.cpp中定义了远程调用的接口,实现了底层通信。可以在Hello.h中找到客户端远程调用需要用到的类HelloClient,调用方法:
void helloString(std::string& _return, const std::string& para);
这个跟thrift文件中申明的方法有点不一定,返回参数是通过引用传回来的。
Hello_server.skeleton.cpp将实现Hello.h的服务端接口,如果要用c++作为服务端,还需要将这个文件拷出去,重命名,实现类HelloHandler的方法helloString,远程调用方法的业务逻辑也就写在helloString中。可能还需要改main函数中的端口信息。
gen-java/demo下只有Hello.java一个文件,它定义了服务端和客户端的接口,实现了底层的通信。
3. 编写java服务端和客户端
仿照tutorial,在hello目录下建立java目录,将tutorial/java/下的一些文件和目录拷到hello/java下
build.xml JavaClient JavaServer src
删除src下所有文件,在src下编写代码。
1) HelloImpl.java 远程过程调用的业务逻辑
import demo.*;
import org.apache.thrift.TException;
class HelloImpl implements Hello.Iface {
public HelloImpl() {}
public String helloString(String para) throws org.apache.thrift.TException {
//各种业务逻辑
return "hello " + para;
}
}
2)Server.java 服务端程序
import demo.*;
import java.io.IOException;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer.Args;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
public class Server {
private void start() {
try {
TServerSocket serverTransport = new TServerSocket(7911);
Hello.Processor processor = new Hello.Processor(new HelloImpl());
Factory protFactory = new TBinaryProtocol.Factory(true, true);
Args args = new Args(serverTransport);
args.processor(processor);
args.protocolFactory(protFactory);
TServer server = new TThreadPoolServer(args);
//TServer server = new TThreadPoolServer(processor, serverTransport, protFactory);
System.out.println("Starting server on port 7911 ...");
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) {
Server srv = new Server();
srv.start();
}
}
3)Client.java 客户端程序
import demo.*;
import java.io.IOException;
import org.apache.thrift.*;
import org.apache.thrift.protocol.*;
import org.apache.thrift.transport.*;
public class Client {
public static void main(String [] args) {
try {
TTransport transport = new TSocket("localhost",7911);
TProtocol protocol = new TBinaryProtocol(transport);
Hello.Client client = new Hello.Client(protocol);
transport.open();
System.out.println("Client
calls hello
");
System.out.println(client.helloString("world"));
transport.close();
} catch (TException x) {
x.printStackTrace();
}
}
}
4) 修改 build.xml
<project name="hello" default="hello"
basedir=".">
<description>Thrift Hello</description>
<property name="src" location="src" />
<property name="gen" location="../gen-java" />
<property name="build" location="build" />
<path id="libs.classpath">
<fileset dir="http://www.cnblogs.com/lib/java/build">
<include name="*.jar" />
<exclude name="-test.jar" />
</fileset>
<fileset dir="http://www.cnblogs.com/lib/java/build/lib">
<include name="*.jar" />
</fileset>
</path>
<path id="build.classpath">
<path refid="libs.classpath" />
<pathelement path="${gen}" />
</path>
<target name="init">
<tstamp />
<mkdir dir="${build}"/>
</target>
<target name="compile" depends="init">
<javac srcdir="${gen}" destdir="${build}" classpathref="libs.classpath" />
<javac srcdir="${src}" destdir="${build}" classpathref="build.classpath" />
</target>
<target name="hello" depends="compile">
<jar jarfile="hello.jar" basedir="${build}"/>
</target>
<target name="clean">
<delete dir="${build}" />
<delete file="hello.jar" />
</target>
</project>
5) 编译
ant
将生成build文件夹
Client.class demo hello HelloImpl.class hello.jar Server.class
6) 修改执行脚本
JavaClient
java -cp http://www.cnblogs.com/lib/java/build/lib/*:http://www.cnblogs.com/lib/java/build/*:hello.jar
Client
JavaServer
java -cp http://www.cnblogs.com/lib/java/build/lib/*:http://www.cnblogs.com/lib/java/build/*:hello.jar
Server
4. 编写c++客户端
同样仿照tutorial,将tutorial/cpp中的Makefile和CppClient.cpp拷到hello/cpp下。
1) 将CppClient.cpp重命名为Client.cpp,并修改
#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <protocol/TBinaryProtocol.h>
#include <transport/TSocket.h>
#include <transport/TTransportUtils.h>
#include "../gen-cpp/Hello.h"
#include <string>
using namespace std;
using namespace apache::thrift;
using namespace apache::thrift::protocol;
using namespace apache::thrift::transport;
using namespace demo;
using namespace boost;
int main(int argc, char** argv) {
shared_ptr<TTransport> socket(new TSocket("localhost",7911));
shared_ptr<TTransport> transport(new TBufferedTransport(socket));
shared_ptr<TProtocol> protocol(new TBinaryProtocol(transport));
HelloClient client(protocol);
try {
transport->open();
string ret;
client.helloString(ret, "world");
printf("%s\n", ret.c_str());
transport->close();
} catch (TException &tx) {
printf("ERROR: %s\n", tx.what());
}
}
2). 修改Makefile
BOOST_DIR = /usr/local/boost/include/boost-1_33_1/
THRIFT_DIR = /usr/local/include/thrift
LIB_DIR = /usr/local/lib
GEN_SRC =../gen-cpp/tt_types.cpp ../gen-cpp/Hello.cpp
default: client
client: Client.cpp
g++-DHAVE_NETINET_IN_H-o
client -I${THRIFT_DIR} -I${BOOST_DIR} -I../gen-cpp -L${LIB_DIR} -lthrift Client.cpp ${GEN_SRC}
clean:
$(RM) -r client
3). 编译
make
生成可执行文件client
5. 运行程序
运行服务端程序,java目录下:./JavaServer
运行客户端程序,cpp目录下:./client
这样c++程序通过 client.helloString(ret, "client") 可以调用服务端的java接口String helloString(String para)。
从而实现了远程多语言调用。

免责声明:文章转载自《ubuntu下thrift的安装》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇让bootstrap-table支持高度百分比SqlServer 数据库同步的两种方式 (发布、订阅),主从数据库之间的同步下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Android x86镜像分析

这几天可能要接个Android的项目,基于x86平台。所以先了解一下android的安装过程。在其官方网站上下载了Android的img,先面就解压出来看看吧,需要说明的是以下的操作都是在root用户下进行的。 mkdir android mount android-x86-4.3-20130725.iso android 通过以上的命令可以把我们下载...

使用VSCode创建Asp.Net Core

前言 .Net Core 2.0已经发布几个月了,惭愧!身为一个开发人员现在才开始接触,有人说有VS这一宇宙第一IDE在,为啥还要用VSCode,为啥?因为我们是程序猿啊!我们是攻城狮啊!我们爱折腾啊,在非windows下体验编译net的那种兴奋刺激的感觉,就像刚接触编程时第一个HelloWorld输出在电脑屏幕时的那种感觉,爽!看看我大net也能跑在li...

Android 播放视频并获取指定时间的帧画面

最近做的项目要求既能播放视频(类似于视频播放器),又能每隔1s左右获取一帧视频画面,然后对图片进行处理,调查了一周,也被折磨了一周,总算找到了大致符合要求的方法。首先对调查过程中涉及到的方法进行简单介绍,再重点介绍最终所采用的方法,话不多说,进入正题。 一.MediaMetadataRetriever 播放视频并取得画面的一帧,大家最先想到应该都是这个,我...

【美国大学生数学建模比赛】2020C题(总结和参赛论文)百度云请自取

好消息:相关论文word版本已经上传至百度云,请三连后自取哈! 链接: https://pan.baidu.com/s/1k5V7D_PQ_tmb6kAmg-NhVg 密码: kj6u 【MCM】2020C题(总结和论文分享) 前言:QAQ ,数学建模美赛竟然在两个多月的疫情中结束了,美赛的这段时间效率属实高,仿佛是这两个月没有学习一下子迸发出的潜力一...

公钥与私钥

在对称加密的时代,加密和解密用的是同一个密钥,这个密钥既用于加密,又用于解密。这样做有一个明显的缺点,如果两个人之间传输文件,两个人都要知道密钥,如果是三个人呢,五个人呢?于是就产生了非对称加密,用一个密钥进行加密(公钥),用另一个密钥进行解密(私钥)。 1.公钥私钥原理 张三有两把钥匙,一把是公钥,另一把是私钥。    张三把公钥送给他的朋友们—-李四、...

HiveSQL 数据定义语言(DDL)

第一章、数据定义语言(DDL)概述 1.1 DDL语法的作用 数据定义语言 (Data Definition Language, DDL),是SQL语言集中对数据库内部的对象结构进行创建,删除,修改等的操作语言,这些数据库对象包括database(schema)、table、view、index等。核心语法由CREATE、ALTER与DROP三个所组成。D...