转自:http://blog.csdn.net/andy_yf/article/details/7487384

thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点;代码侵入较强是其弱点。

下面记录以C++做服务器,C++,java和python做客户端的示例,这个和本人现在工作环境吻合,使用多线程长连接的socket来建立高效分布式系统的跨语言调用平台。遗憾的是目前版本(0.7.0)的C语言还不支持Compact协议,导致在现在的环境中nginx c module调用thrift要使用binary协议。thrift开发团队似乎对C语言不太感冒。

1.定义idl文件acsuser.thrift

1 structUser{2 1: stringuid,3 2: stringuname,4 3: boolusex,5 4: i16 uage,6 }7 service UserService{8 void add(1: User u),9 User get(1: stringuid),10 }

2.生成c++,java和python代码框架

1 thrift -r --gen cpp acsuser.thrift2 thrift -r --gen java acsuser.thrift3 thrift -r --gen py acsuser.thrift

这时生成子目录gen-cpp,gen-java,gen-py

3.生成C++服务端代码

cp gen-cpp/UserService_server.skeleton.cpp UserServer.cpp

修改UserServer.cpp

1 #include "UserService.h"

2 #include

3 //#include

4 #include

5 #include

6 #include

7 #include

8 #include

9 #include

10 #include

11 #include

12

13 using namespace::apache::thrift;14 using namespace::apache::thrift::protocol;15 using namespace::apache::thrift::transport;16 using namespace::apache::thrift::server;17 using namespace::apache::thrift::concurrency;18

19 usingboost::shared_ptr;20

21 class UserServiceHandler : virtual publicUserServiceIf {22 public:23 UserServiceHandler() {24 //Your initialization goes here

25 }26

27 void add(const User&u) {28 //Your implementation goes here

29 printf("uid=%s uname=%s usex=%d uage=%d\n", u.uid.c_str(), u.uname.c_str(), u.usex, u.uage);30 }31

32 void get(User& _return, const std::string&uid) {33 //Your implementation goes here

34 _return.uid = "leo1";35 _return.uname = "yueyue";36 _return.usex = 1;37 _return.uage = 3;38 printf("uid=%s uname=%s usex=%d uage=%d\n", _return.uid.c_str(), _return.uname.c_str(), _return.usex, _return.uage);39 }40

41 };42

43 int main(int argc, char **argv) {44 shared_ptr handler(newUserServiceHandler());45 shared_ptr processor(newUserServiceProcessor(handler));46 shared_ptr protocolFactory(newTCompactProtocolFactory());47 shared_ptr transportFactory(newTBufferedTransportFactory());48 shared_ptr serverTransport(new TServerSocket(9090));49

50 shared_ptr threadManager = ThreadManager::newSimpleThreadManager(10);51 shared_ptr threadFactory = shared_ptr(newPosixThreadFactory());52 threadManager->threadFactory(threadFactory);53 threadManager->start();54 printf("start user server...\n");55

56 TThreadPoolServer server(processor, serverTransport, transportFactory, protocolFactory, threadManager);57 server.serve();58 return 0;59 }

注意这段代码使用TCompactProtocol,需要#include

另外这个是Blocking的多线程服务器

4.生成C++的client文件UserClient.cpp

1 #include "UserService.h"

2 #include

3 #include

4 #include

5 #include

6

7 using namespaceapache::thrift;8 using namespaceapache::thrift::protocol;9 using namespaceapache::thrift::transport;10

11 usingboost::shared_ptr;12

13 int main(int argc, char **argv) {14 boost::shared_ptr socket(new TSocket("localhost", 9090));15 boost::shared_ptr transport(newTBufferedTransport(socket));16 boost::shared_ptr protocol(newTCompactProtocol(transport));17

18 transport->open();19

20 User u;21 u.uid = "leo";22 u.uname = "yueyue";23 u.usex = 1;24 u.uage = 3;25

26 UserServiceClient client(protocol);27 client.add(u);28

29 User u1;30 client.get(u1,"lll");31

32 transport->close();33 printf("uid=%s uname=%s usex=%d uage=%d\n", u1.uid.c_str(), u1.uname.c_str(), u1.usex, u1.uage);34 return 0;35 }

5.生成Makefile

1 BOOST_DIR = /usr/local/include/boost/

2 THRIFT_DIR = /usr/local/include/thrift3 LIB_DIR = /usr/local/lib4 GEN_SRC = ./gen-cpp/acsuser_types.cpp ./gen-cpp/acsuser_constants.cpp ./gen-cpp/UserService.cpp5 default: server client6 server: UserServer.cpp7 g++ -g -o UserServer -I${THRIFT_DIR} -I${BOOST_DIR} -I./gen-cpp -L${LIB_DIR} -lthrift UserServer.cpp ${GEN_SRC}8 client: UserClient.cpp9 g++ -g -o UserClient -lm -pthread -lz -lrt -lssl -I${THRIFT_DIR} -I${BOOST_DIR} -I./gen-cpp -L${LIB_DIR} -lthrift UserClient.cpp ${GEN_SRC}10 clean:11 $(RM) -r UserServer UserClient

6.启动c++ server

1 ./UserServer

7.测试c++ client

1 ./UserClient

8.写java client文件UserClient.java

1 import org.apache.thrift.TException;2 import org.apache.thrift.protocol.TCompactProtocol;3 import org.apache.thrift.protocol.TProtocol;4 import org.apache.thrift.transport.TFramedTransport;5 import org.apache.thrift.transport.TNonblockingSocket;6 import org.apache.thrift.transport.TSocket;7 import org.apache.thrift.transport.TTransport;8 import org.apache.thrift.transport.TTransportException;9

10 //import UserService.Client;

11

12 public classUserClient {13 private voidstart() {14 try{15 TTransport socket = new TSocket("localhost", 9090);16 //TTransport transport = new TFramedTransport(socket);

17 TProtocol protocol = newTCompactProtocol(socket);18

19 UserService.Client client = newUserService.Client(protocol);20 socket.open();21 System.out.println(client.get("lll"));22

23 User u = newUser();24 u.uid="leojava";25 u.uname="yueyue";26 u.usex=true;27 u.uage=3;28 client.add(u);29 socket.close();30

31 } catch(TTransportException e) {32 e.printStackTrace();33 } catch(TException e) {34 e.printStackTrace();35 }36 }37

38 public static voidmain(String[] args) {39 UserClient c = newUserClient();40 c.start();41

42 }43 }

编译和运行java client

1 javac -classpath /usr/local/lib/libthrift-0.7.0.jar:/usr/local/lib/log4j-1.2.14.jar:/usr/local/lib/commons-logging-1.1.1.jar:/usr/local/lib/slf4j-api-1.5.8.jar UserClient.java ./gen-java/*.java2 java -classpath .:./gen-java:/usr/local/lib/libthrift-0.7.0.jar:/usr/local/lib/log4j-1.2.14.jar:/usr/local/lib/commons-logging-1.1.1.jar:/usr/local/lib/slf4j-api-1.5.8.jar:/usr/local/lib/slf4j-log4j12-1.5.8.jar UserClient

9.写Python client文件PythonClient.py

1 #!/usr/bin/env python2 import sys3 sys.path.append('./gen-py')4 fromacsuser import UserService5 from acsuser.ttypes import *

6 fromthrift import Thrift7 fromthrift.transport import TSocket8 fromthrift.transport import TTransport9 fromthrift.protocol import TCompactProtocol10

11 # Make socket12 transport = TSocket.TSocket('localhost', 9090)13 # Buffering iscritical. Raw sockets are very slow14 transport =TTransport.TBufferedTransport(transport)15 # Wrap ina protocol16 protocol =TCompactProtocol.TCompactProtocol(transport)17 # Create a client to use the protocol encoder18 client =UserService.Client(protocol)19 # Connect!

20 transport.open()21 # Call Server services22 u = client.get('lll')23 print 'uid=%s uname=%s usex=%d u.uage=%d' %(u.uid,u.uname,u.usex,u.uage)24

25 u1 =User()26 u1.uid='leo'

27 u1.uname='yueyue'

28 u1.usex=1

29 u1.uage=3

30 client.add(u1)

执行python client代码

1 chmod 777PythonClient.py2 ./PythonClient.py

thrift java长连接_利用thrift在c++、java和python之间相互调用相关推荐

  1. 利用itext包实现java报表打印_利用iText包实现Java报表打印

    在信息系统应用中,报表处理一直起着比较重要的作用.Java报表制作中最常使用的是iText组件,它是一种生成PDF报表的Java组件.本文讨论两种形式的PDF报表处理,一种是通过程序对象生成整个PDF ...

  2. plsql保持长连接_知乎千万级高性能长连接网关是如何搭建的

    作者:@faceair @安江泽原文:https://zhuanlan.zhihu.com/p/66807833 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如 ...

  3. java 多个项目间事物_Java-web-多个独立项目之间相互调用实践

    本篇文章只涉及到应用层面,没有涉及到什么底层原理之类的,我目前的实力还没有达到那个级别.如果是大神级别的人看到这篇文章,请跳过. 项目框架也已经是搭建好了的,springboot版本为1.5,数据库操 ...

  4. java android长连接_基于Java Socket的自定义协议,实现Android与服务器的长连接(一)...

    一.基础知识准备 在正式给大家介绍自定义协议之前,我们先对网络传输和协议解析的相关知识点做一个基本的介绍,尽管这些知识点我们在学校里学过,但难免会有所遗忘,这里先做一个简单的介绍,以便对后文的内容理解 ...

  5. java 火焰_利用火焰图查找java耗时最长的方法

    原标题:利用火焰图查找java耗时最长的方法 众所周知java方法有两种,一种是纯粹的java方法,另外一种是jni,java调用c的,方法声明是java的,实现并不是. 现在通过jni实现一些效率的 ...

  6. java 短连接转长连接_转:关于长连接和短连接

    TCP/IP通信程序设计的丰富多样性 刚接触TCP/IP通信设计的人根据范例可以很快编出一个通信程 序,据此一些人可能会认为TCP/IP编程很简单.其实不然, TCP/IP编程具有较为丰富的内容.其编 ...

  7. python mobile-hi.codemao.cn_使用thrift做c++,java和python的相互调用

    linux上安装thrift见 http://jinghong.iteye.com/blog/1102535 thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点:代码侵入较强是其弱点. ...

  8. java长连接socket【转】http://jiewo.iteye.com/blog/1562168

    java socket 长连接 博客分类: java socketjavathread  最近做SSO的项目,其中用到了socket长连接.一直都是看代码的,但是要求socket做成SSL的,不得不动 ...

  9. java长连接转短连接_java原生程序redis连接(连接池/长连接和短连接)选择问题...

    原标题:java原生程序redis连接(连接池/长连接和短连接)选择问题 最近遇到的连接问题我准备从重构的几个程序(redis和mysql)长连接和短连接,以及连接池和单连接等问题用几篇博客来总结下. ...

最新文章

  1. osgi 模块化_OSGI –模块化您的应用程序
  2. android android 修改 jpg exif 属性,Android开发之使用ExifInterface获取拍照后的图片属性...
  3. 产品经理必懂的技术那点事儿 pdf_产品经理10大基础技能(5):读透神经网络和机器学习...
  4. jsp_el内置对象pageContext和Cookie
  5. MFC-CFileException类学习笔记
  6. saltstack管理二之saltstack的安装
  7. android apk 对应目录,android 如何预置APK到 data 和system/app目录
  8. 扫锚工具:xscan.exe
  9. Tomcat优化大全,进来看了,真就会了
  10. 博弈论中的简单合作博弈 C#实现
  11. 伺服电机负载惯量比的合理取值
  12. HTTP和HTTPS请求的整个过程详解
  13. “汇新杯”青年创客专项赛介绍
  14. 今天16:00 | 中科院计算所研究员孙晓明老师带大家走进量子的世界
  15. 整理一道测试面试题(微信更换头像测试用例)
  16. 应用分发是什么意思?APP内测分发步骤
  17. 用canvas代码写或者three.js代码写一张截图,这张截图里面包含4张图片 ,其中3张图片有倾斜立体效果,剩下的一张是背景图...
  18. 梅科尔工作室-李庆浩 深度学习-KNN算法
  19. 小白虎远程控制软件待实现功能以及用户反馈! 请大家及时反馈需要完善的地方!
  20. 解决锁定图层后不能淡显的问题

热门文章

  1. php 实现两变量值对换,PHP互换两个变量值的方法(不用第三变量)
  2. 蓝桥杯嵌入式板-解决LCD使LED亮灭混乱的办法
  3. java去掉mongodb日志_JAVA开发 Mongodb3.0以上 去掉控制台DEBUG信息
  4. JDK8新特性(十四)之日期时间API
  5. php实例新讲php,实例讲解PHP5 新特性
  6. 揪出数据库中看不见的字符
  7. screw ---- 数据库转文档
  8. GaiGai----1
  9. beeline执行sql文件_【SparkSQL】介绍、与Hive整合、Spark的th/beeline/jdbc/thriftserve2、shell方式使用SQL...
  10. unity ab包加载_Unity资源管理和打包