使用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选取操作

    转自:http://blog.csdn.net/wirelessqa/article/details/8567702 话不多说,直接上码: activity_main.xml <ScrollVi ...

  2. Go -- FileManage 自建云盘

    一.介绍 Caddy,用Go写的一款相当优秀的Web服务器软件,它有不少很有特色的功能,国内目前来说用的不多,不过也逐渐有越来越多的人知道了,它有个特色的插件功能,其中一款插件是FileManager ...

  3. 添加javabrowser 支持中文

    //搜网上的javabrowser都不支持中文在线修改保存,且文件名包含中文.修改如下 <%@page import="java.util.*, java.net.*, java.te ...

  4. Hive 内建操作符与函数开发——深入浅出学Hive

    第一部分:关系运算 Hive支持的关系运算符 •常见的关系运算符 •等值比较: = •不等值比较: <> •小于比较: < •小于等于比较: <= •大于比较: > •大 ...

  5. NormalMap 贴图 【转】

    转载: http://www.zwqxin.com/archives/shaderglsl/review-normal-map-bump-map.html   说起Normal Map(法线贴图),就 ...

  6. jstl标签不起作用不管用,jstl标签直接输出表达式

    jstl标签不起作用不管用,jstl标签直接输出表达式 解决办法: 在jsp页面头上 引入: <%@ page isELIgnored="false"%> 便能够解决.

  7. Activex打包于发布完整版---微软证书制作

    众所周知,Activex组件没有进行有效的签名,在IE上无法安装的,除非你让用户手工开启“接收任何未签名的ActiveX”,这个很明显不现实.而组件签名需要证书,证书从哪里来,你可以选择付1000到3 ...

  8. java运行环境(JRE)

    Java Runtime Environment(JRE) :运行Java程序所必须的环境的集合. JRE的组成: –包括Java 虚拟机 (JVM).Java核心类和支持文件. –不包含开发工具 - ...

  9. iOS_Xcode怎样准确定位到产生异常的出错代码

    当应用程序出现异常而导致崩溃时, 可能光标仅仅提示异常出如今主函数代码处,例如以下图所看到的: 这样的情况下.即使看了日志. 也可能仍不清楚详细是哪一句代码产生了异常. 因此,须要手动设置异常断点. ...

  10. canvas锯齿

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...