thrift java长连接_利用thrift在c++、java和python之间相互调用
转自: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之间相互调用相关推荐
- 利用itext包实现java报表打印_利用iText包实现Java报表打印
在信息系统应用中,报表处理一直起着比较重要的作用.Java报表制作中最常使用的是iText组件,它是一种生成PDF报表的Java组件.本文讨论两种形式的PDF报表处理,一种是通过程序对象生成整个PDF ...
- plsql保持长连接_知乎千万级高性能长连接网关是如何搭建的
作者:@faceair @安江泽原文:https://zhuanlan.zhihu.com/p/66807833 实时的响应总是让人兴奋的,就如你在微信里看到对方正在输入,如你在王者峡谷里一呼百应,如 ...
- java 多个项目间事物_Java-web-多个独立项目之间相互调用实践
本篇文章只涉及到应用层面,没有涉及到什么底层原理之类的,我目前的实力还没有达到那个级别.如果是大神级别的人看到这篇文章,请跳过. 项目框架也已经是搭建好了的,springboot版本为1.5,数据库操 ...
- java android长连接_基于Java Socket的自定义协议,实现Android与服务器的长连接(一)...
一.基础知识准备 在正式给大家介绍自定义协议之前,我们先对网络传输和协议解析的相关知识点做一个基本的介绍,尽管这些知识点我们在学校里学过,但难免会有所遗忘,这里先做一个简单的介绍,以便对后文的内容理解 ...
- java 火焰_利用火焰图查找java耗时最长的方法
原标题:利用火焰图查找java耗时最长的方法 众所周知java方法有两种,一种是纯粹的java方法,另外一种是jni,java调用c的,方法声明是java的,实现并不是. 现在通过jni实现一些效率的 ...
- java 短连接转长连接_转:关于长连接和短连接
TCP/IP通信程序设计的丰富多样性 刚接触TCP/IP通信设计的人根据范例可以很快编出一个通信程 序,据此一些人可能会认为TCP/IP编程很简单.其实不然, TCP/IP编程具有较为丰富的内容.其编 ...
- python mobile-hi.codemao.cn_使用thrift做c++,java和python的相互调用
linux上安装thrift见 http://jinghong.iteye.com/blog/1102535 thrift做为跨语言调用的方案有高效,支持语言较多,成熟等优点:代码侵入较强是其弱点. ...
- java长连接socket【转】http://jiewo.iteye.com/blog/1562168
java socket 长连接 博客分类: java socketjavathread 最近做SSO的项目,其中用到了socket长连接.一直都是看代码的,但是要求socket做成SSL的,不得不动 ...
- java长连接转短连接_java原生程序redis连接(连接池/长连接和短连接)选择问题...
原标题:java原生程序redis连接(连接池/长连接和短连接)选择问题 最近遇到的连接问题我准备从重构的几个程序(redis和mysql)长连接和短连接,以及连接池和单连接等问题用几篇博客来总结下. ...
最新文章
- osgi 模块化_OSGI –模块化您的应用程序
- android android 修改 jpg exif 属性,Android开发之使用ExifInterface获取拍照后的图片属性...
- 产品经理必懂的技术那点事儿 pdf_产品经理10大基础技能(5):读透神经网络和机器学习...
- jsp_el内置对象pageContext和Cookie
- MFC-CFileException类学习笔记
- saltstack管理二之saltstack的安装
- android apk 对应目录,android 如何预置APK到 data 和system/app目录
- 扫锚工具:xscan.exe
- Tomcat优化大全,进来看了,真就会了
- 博弈论中的简单合作博弈 C#实现
- 伺服电机负载惯量比的合理取值
- HTTP和HTTPS请求的整个过程详解
- “汇新杯”青年创客专项赛介绍
- 今天16:00 | 中科院计算所研究员孙晓明老师带大家走进量子的世界
- 整理一道测试面试题(微信更换头像测试用例)
- 应用分发是什么意思?APP内测分发步骤
- 用canvas代码写或者three.js代码写一张截图,这张截图里面包含4张图片 ,其中3张图片有倾斜立体效果,剩下的一张是背景图...
- 梅科尔工作室-李庆浩 深度学习-KNN算法
- 小白虎远程控制软件待实现功能以及用户反馈! 请大家及时反馈需要完善的地方!
- 解决锁定图层后不能淡显的问题
热门文章
- php 实现两变量值对换,PHP互换两个变量值的方法(不用第三变量)
- 蓝桥杯嵌入式板-解决LCD使LED亮灭混乱的办法
- java去掉mongodb日志_JAVA开发 Mongodb3.0以上 去掉控制台DEBUG信息
- JDK8新特性(十四)之日期时间API
- php实例新讲php,实例讲解PHP5 新特性
- 揪出数据库中看不见的字符
- screw ---- 数据库转文档
- GaiGai----1
- beeline执行sql文件_【SparkSQL】介绍、与Hive整合、Spark的th/beeline/jdbc/thriftserve2、shell方式使用SQL...
- unity ab包加载_Unity资源管理和打包