使用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

http://www.slf4j.org/

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)的更多相关文章

  1. Golang、Php、Python、Java基于Thrift0.9.1实现跨语言调用

    目录: 一.什么是Thrift? 1) Thrift内部框架一瞥 2) 支持的数据传输格式.数据传输方式和服务模型 3) Thrift IDL 二.Thrift的官方网站在哪里? 三.在哪里下载?需要 ...

  2. Golang通过Thrift框架完美实现跨语言调用

    每种语言都有自己最擅长的领域,Golang 最适合的领域就是服务器端程序. 做为服务器端程序,需要考虑性能同时也要考虑与各种语言之间方便的通讯.采用http协议简单,但性能不高.采用TCP通讯,则需要 ...

  3. Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结

    Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...

  4. 跨语言调用Hangfire定时作业服务

    跨语言调用Hangfire定时作业服务 背景 Hangfire允许您以非常简单但可靠的方式执行后台定时任务的工作.内置对任务的可视化操作.非常方便. 但令人遗憾的是普遍都是业务代码和hagnfire服 ...

  5. C++ 跨语言调用 Java

    C++ 跨语言调用 Java Java JDK 提供了 JNI 接口供 C/C++ 程序调用 Java 编译后的类与方法,主要依赖于头文件(jni.h) 和 动态库(jvm.so/jvm.dll),由 ...

  6. vs2019 Com组件初探-简单的COM编写以及实现跨语言调用

    前提条件 1.掌握C++基础语法 2.平台安装 vs2019 3.本地平台为 windows 10 1909 X64 4.了解vbs基础语法 本次目标 1.掌握Com组件的概念及原理 2.编写一个简单 ...

  7. Atitit.跨语言异常转换机制 java c# php到js的异常转换

    Atitit.跨语言异常转换机制 java c# php到js的异常转换 1. bizEx   直接抓取,然后js catchEX1 2. Chkec runtimeEx1 3. Other异常..J ...

  8. Java跨语言调用,使用JNA访问Java外部接口

    1. JNA简单介绍 先说JNI(Java Native Interface)吧,有过不同语言间通信经历的一般都知道,它允许Java代码和其他语言(尤其C/C++)写的代码进行交互,只要遵守调用约定即 ...

  9. CLS(公共语言规范)的CLSCompliant(跨语言调用)

    .net的一个很重要的特性就是跨语言的编程,用C#写的dll可以在VB.net里调用,例如:用C#写的一个类,编译到dll中,然后在VB.net中调用: using System;namespace  ...

随机推荐

  1. 初始加载时edittext不自动获取焦点的方法

    在做一个搜索功能时,刚进入界面,edittext直接自动获取焦点,这显然不是我想要的. 那么问题来了:如何关闭EditText自动获取焦点的? 尝试了好几个方法,在Java代码添加focus控制,在x ...

  2. JS isNaN()函数

    1.作用 isNaN() 函数用于检查其参数是否是非数字值. 2.JS <script> document.write(isNaN(123)); document.write(isNaN( ...

  3. mac下如何全量删除短信内容

    退出messages应用 执行命令:rm -r ~/Library/Messages/chat.* 重启messages 如果遇到下面问题:重启mac

  4. shell 脚本中执行mysql语句

    通过hash建表之后,表的数据量巨大2048,那怎么去验证表是否建成功呢? 逻辑生成表名这部分就不写了.只要能建表成功,这部分的脚本肯定是有的.那么怎么在shell中执行selec查询并返回呢 只要在 ...

  5. VMware Workstation 重启服务脚本 解决连不上ssh问题

    解决虚拟机,每次启动连不上ssh问题,需要关闭虚拟机,再执行脚本.执行完后,再启动虚拟机就可以连上ssh啦! 脚本名称:vmware_server_restart.bat (请以管理员身份运行,否则可 ...

  6. SecureRandom产生强随机数简介

    SecureRandom是强随机数生成器,主要应用的场景为:用于安全目的的数据数,例如生成秘钥或者会话标示(session ID),弱随机数生成器会产生严重的安全问题,而使用SecureRandom这 ...

  7. Python爬虫之一 PySpider 抓取淘宝MM的个人信息和图片

    ySpider 是一个非常方便并且功能强大的爬虫框架,支持多线程爬取.JS动态解析,提供了可操作界面.出错重试.定时爬取等等的功能,使用非常人性化. 本篇通过做一个PySpider 项目,来理解 Py ...

  8. windows 服务器不能使用剪贴板解决办法

    您可以在系统资源中先结束rdpclip.exe进程,然后重新打开c:\windows\system32\rdpclip.exe即可

  9. Android之旅七 Service简介

    1.          Service是什么:它是一个应用程序组件.没有图形化界面.通常用来处理一些耗时比较长的操作(例如下载.播放MP3等等).可以使用Service更新ContentProvide ...

  10. 用editplus编写python

    语法高亮和自己主动补全: http://www.editplus.com/files/pythonfiles.zip 选择菜单条的-->工具-->配置用户工具-->设置&语法 ...