使用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:javaserver 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 ...
随机推荐
- 初始加载时edittext不自动获取焦点的方法
在做一个搜索功能时,刚进入界面,edittext直接自动获取焦点,这显然不是我想要的. 那么问题来了:如何关闭EditText自动获取焦点的? 尝试了好几个方法,在Java代码添加focus控制,在x ...
- JS isNaN()函数
1.作用 isNaN() 函数用于检查其参数是否是非数字值. 2.JS <script> document.write(isNaN(123)); document.write(isNaN( ...
- mac下如何全量删除短信内容
退出messages应用 执行命令:rm -r ~/Library/Messages/chat.* 重启messages 如果遇到下面问题:重启mac
- shell 脚本中执行mysql语句
通过hash建表之后,表的数据量巨大2048,那怎么去验证表是否建成功呢? 逻辑生成表名这部分就不写了.只要能建表成功,这部分的脚本肯定是有的.那么怎么在shell中执行selec查询并返回呢 只要在 ...
- VMware Workstation 重启服务脚本 解决连不上ssh问题
解决虚拟机,每次启动连不上ssh问题,需要关闭虚拟机,再执行脚本.执行完后,再启动虚拟机就可以连上ssh啦! 脚本名称:vmware_server_restart.bat (请以管理员身份运行,否则可 ...
- SecureRandom产生强随机数简介
SecureRandom是强随机数生成器,主要应用的场景为:用于安全目的的数据数,例如生成秘钥或者会话标示(session ID),弱随机数生成器会产生严重的安全问题,而使用SecureRandom这 ...
- Python爬虫之一 PySpider 抓取淘宝MM的个人信息和图片
ySpider 是一个非常方便并且功能强大的爬虫框架,支持多线程爬取.JS动态解析,提供了可操作界面.出错重试.定时爬取等等的功能,使用非常人性化. 本篇通过做一个PySpider 项目,来理解 Py ...
- windows 服务器不能使用剪贴板解决办法
您可以在系统资源中先结束rdpclip.exe进程,然后重新打开c:\windows\system32\rdpclip.exe即可
- Android之旅七 Service简介
1. Service是什么:它是一个应用程序组件.没有图形化界面.通常用来处理一些耗时比较长的操作(例如下载.播放MP3等等).可以使用Service更新ContentProvide ...
- 用editplus编写python
语法高亮和自己主动补全: http://www.editplus.com/files/pythonfiles.zip 选择菜单条的-->工具-->配置用户工具-->设置&语法 ...