使用thrift进行跨语言调用(php c# java)
使用thrift进行跨语言调用(php c# java)
1:前言
实际上本文说的是跨进程的异构语言调用,举个简单的例子就是利用PHP写的代码去调C#或是java写的服务端。其实除了本文提供的办法还有其他办法,例如http+xml(json)等等都能做到。
本文的意义是介绍thrift,记录我在调试thrift时遇到的问题和相应的解决方案,避免大家走弯路。
2:大概的流程
thrift是通过socket+序列化协议来完成跨语言调用的。类似的方案有protocolbuffer(http://code.google.com/p/protobuf/)这个性能出众,thrift性能我回头再做测试。
使用的流程是
A:定义自己的通信接口,接口可以使用的数据类型有string,int32等,当然你也可以自己定义枚举和结构体
B:使用thrift.exe生成相应的代码
C:调用
3:c#,PHP,Java在调试thrift时遇到的问题
首先我们去下载thrift,地址是http://thrift.apache.org/
解压缩后会看到
lib下就是执行的各种语言的代码。
A:调试PHP注意事项
一定要注册各个php代码也就是这句。
require_once __DIR__. '/lib/Thrift/ClassLoader/ThriftClassLoader.php' ; $loader = new ThriftClassLoader(); $loader ->registerNamespace( 'Thrift' , __DIR__ . '/lib' ); $loader ->register(); |
B:调试java注意事项
下载没有提供的包
地址是:
http://commons.apache.org/proper/commons-lang/download_lang.cgi
http://hc.apache.org/downloads.cgi
3:demo
定义接口(方法名不能一样)

enum ParameterValueType
{
AnsiString = 1,
Byte,
Boolean,
Currency = 4,
Date,
DateTime,
Decimal,
Double,
Guid,
Int16,
Int32,
Int64,
String,
Time,
Xml
} enum ParameterValueDirection
{
Input,
Output,
InputOutput,
ReturnValue
} enum AdoCommandType
{
Text,
StoredProcedure
} struct DBParameter {
1: string DbParameterName,
2: ParameterValueType DbType,
3: string DbParameterValue,
4: ParameterValueDirection DbDirection,
5: i32 Size
} struct ResultMessage {
1: i32 IsSuccess,
2: string ErrorMessage,
3: string ReturnValue,
4: list<DBParameter> ReturnParameter,
5: list<string> DataSetColumnName,
6: list<list<string>> DataSetRowValue
} service DataAccessComponent {
ResultMessage ExecuteDataset(1:string ConnectionConfigKey,2:AdoCommandType commandType,3:string commandText,4:list<DBParameter> DBParameter),
ResultMessage ExecuteNonQuery(1:string ConnectionConfigKey,2:AdoCommandType commandType,3:string commandText,4:list<DBParameter> DBParameter),
ResultMessage ExecuteScalar(1:string ConnectionConfigKey,2:AdoCommandType commandType,3:string commandText,4:list<DBParameter> DBParameter),
}

生成代码
thrift -gen java ado.thrift
thrift -gen php ado.thrift
thrift -gen csharp ado.thrift
根据语言把生成的语言放到相应的文件夹下。
下面简单列一下调用代码
1:PHP //设置IP,端口建立连接 $socket = new TSocket( 'localhost' , '9090' ); $transport = new TBufferedTransport($socket); //选定通信协议 $protocol = new TBinaryProtocol($transport); $client = new DataAccessComponentClient($protocol); //生成的类 2:c# server int port = 9090; DataAccess da = new DataAccess(); // Processor DataAccessComponent.Processor pc = new DataAccessComponent.Processor(da); // Transport TServerSocket tServerSocket = new TServerSocket(port); // Protocol factory TProtocolFactory tProtocolFactory = new TBinaryProtocol.Factory(); TServer serverEngine; // Simple Server serverEngine = new TSimpleServer(pc, tServerSocket); // ThreadPool Server //serverEngine = new TThreadPoolServer(pc,tServerSocket); // Run it serverEngine.Serve(); client TTransport transport = new TSocket( "localhost" , 9090); TProtocol protocol = new TBinaryProtocol(transport); ThriftTest.Client client = new ThriftTest.Client(protocol); transport.Open(); int val = client.test( "1213" ); client.work(); transport.Close(); Console.WriteLine(val); Console.ReadLine(); 3:java server try { //private static final Logger LOGGER = LoggerFactory.getLogger(Processor.class.getName()); //System.setProperty("log4j.configuration", "log4j.properties"); int port = 9090; // Processor ThriftServer testHandler = new ThriftServer(); ThriftTest.Processor testProcessor = new ThriftTest.Processor(testHandler); // Transport TServerSocket tServerSocket = new TServerSocket(port); // Protocol factory TProtocolFactory tProtocolFactory = new TBinaryProtocol.Factory(); TServer serverEngine; // Simple Server //serverEngine = new TSimpleServer(new Args(tServerSocket).processor(testProcessor)); // ThreadPool Server serverEngine = new TThreadPoolServer( new TThreadPoolServer.Args(tServerSocket).processor(testProcessor).protocolFactory(tProtocolFactory)); //Set server event handler serverEngine.setServerEventHandler( new TestServerEventHandler()); // Run it System. out .println( "Starting the server on port " + port + "..." ); serverEngine.serve(); } catch (Exception x) { x.printStackTrace(); } System. out .println( "done." ); |
使用thrift进行跨语言调用(php c# java)的更多相关文章
- Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用
目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...
- Golang通过Thrift框架完美实现跨语言调用
每种语言都有自己最擅长的领域,Golang 最适合的领域就是服务器端程序. 做为服务器端程序,需要考虑性能同时也要考虑与各种语言之间方便的通讯.采用http协议简单,但性能不高.采用TCP通讯,则需要 ...
- Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结
Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...
- 跨语言调用Hangfire定时作业服务
跨语言调用Hangfire定时作业服务 背景 Hangfire允许您以非常简单但可靠的方式执行后台定时任务的工作.内置对任务的可视化操作.非常方便. 但令人遗憾的是普遍都是业务代码和hagnfire服 ...
- C++ 跨语言调用 Java
C++ 跨语言调用 Java Java JDK 提供了 JNI 接口供 C/C++ 程序调用 Java 编译后的类与方法,主要依赖于头文件(jni.h) 和 动态库(jvm.so/jvm.dll),由 ...
- vs2019 Com组件初探-简单的COM编写以及实现跨语言调用
前提条件 1.掌握C++基础语法 2.平台安装 vs2019 3.本地平台为 windows 10 1909 X64 4.了解vbs基础语法 本次目标 1.掌握Com组件的概念及原理 2.编写一个简单 ...
- Atitit.跨语言异常转换机制 java c# php到js的异常转换
Atitit.跨语言异常转换机制 java c# php到js的异常转换 1. bizEx 直接抓取,然后js catchEX1 2. Chkec runtimeEx1 3. Other异常..J ...
- Java跨语言调用,使用JNA访问Java外部接口
1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即 ...
- CLS(公共语言规范)的CLSCompliant(跨语言调用)
.net的一个很重要的特性就是跨语言的编程,用C#写的dll可以在VB.net里调用,例如:用C#写的一个类,编译到dll中,然后在VB.net中调用: using System;namespace ...
随机推荐
- Arch linux
这里将介绍Arch Linux使用问题的解决方法,在这里拿出来和大家分享一下Linux目前较适用于小型的网络,Arch Linux 是个针对 i686i686/x86-64 优化的 Linux 发行版 ...
- appium+python自动化49-yaml管理定位元素
前言 如何高效管理定位元素,这个是很有学问的问题,也是面试必问的[以下纯属个人观点,勿喷!]. 有的人用xml管理页面定位元素,这种逼格略高,但是小编认为学习成本大,贼麻烦. 有的人提到用excel管 ...
- JS中eval函数的使用
/*************************************************注册用户证件号 复选框 combox循环赋值**************************** ...
- humanoid ik unity 配件 animation的问题
遇到这样一个问题 想给角色设置ik 以实现代码控制的 更为自然的 角色动作 比如角色头跟随点击转动 身体也有相应扭转 https://docs.unity3d.com/Manual/InverseKi ...
- 【Web】前台传送JSON格式数据到后台Shell处理
1.js中的json对象和字符串之间的转化:http://www.oschina.net/code/snippet_175925_6288 代码片段: var obj = JSON.parse(des ...
- .css()与.addClass()设置样式的区别
对于样式的设置,addClass与css方法两者之间有什么区别? 可维护性: .addClass()的本质是通过定义个class类的样式规则,给元素添加一个或多个类.css方法是通过JavaScrip ...
- JMeter 三:搭建一个Web Test Plan
参考:http://jmeter.apache.org/usermanual/build-web-test-plan.html 场景 5个用户并发测试百度搜索,有两个请求,一个请求搜索“你好”,一个请 ...
- git commit 出现 changes not staged for commit 错误
git commit 出现 changes not staged for commit 错误 修复: 参考:http://stackoverflow.com/questions/8488887/git ...
- expect脚本免密码
#!/usr/bin/expect set timeout spawn ssh root@20.0.102.19 expect "password:" send "123 ...
- 基于shiro+jwt的真正rest url权限管理,前后端分离
代码地址如下:http://www.demodashi.com/demo/13277.html bootshiro & usthe bootshiro是基于springboot+shiro+j ...