使用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. Luci实现框架

    转自:http://www.cnblogs.com/zmkeil/archive/2013/05/14/3078774.html 1.总述 上一篇总结了uhttpd的工作方式,openwrt中利用它作 ...

  2. 使用Apache POI导出Excel小结--导出XLS格式文档

    使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI ...

  3. 【LaTeX】E喵的LaTeX新手入门教程(3)数学公式

    昨天熄灯了真是坑爹.前情回顾[LaTeX]E喵的LaTeX新手入门教程(1)准备篇 [LaTeX]E喵的LaTeX新手入门教程(2)基础排版上一期测试答案1.大家一开始想到的肯定是\LaTeX{}er ...

  4. ActionError,ActionMessage推荐

    尽管Struts框架供给了管用的失常处理机制,但不能保证处理所有的讹谬,这时Struts框架会把讹谬抛给Web容器,在默认情形下Web容器会向用户博览器直接归来原始消息.万一想避免直接让用户看到这些原 ...

  5. java常用命令行

    1.javac(编译java源文件) javac是用来编译.java文件的. 例子: package com.fjassa.domain;  public class Human.public cla ...

  6. Python学习1:使用Aptana构建Python开发环境

    使用Aptana构建Python开发环境 下载Aptana: http://www.aptana.com/products/studio3/download http://www.newasp.net ...

  7. 【笔记】选择框 change 事件获取内容

    还记得之前做过一次js 的联动效果,在获取下拉框change事件后的 value 时,当时的我做得比较费劲. 现在看了高程的表单脚本那一章之后发现有一个更好的方法,那就是直接获取下拉框change 事 ...

  8. 帮助更语义化的显示时间的jQuery插件 - tidyTime.js

    来源:GBin1.com 网站或者web应用开发过程中,难免会遇到需要展示时间的地方,例如,留言时间或者发布帖子的时候,那么大家是不是相关过使用更加符合语义学的方式来显示时间呢? 08:15  显示成 ...

  9. Django 学习记录

    这是我自己理解并自己画的,django 请求示意图,表示了它的组织方式. project manage.py: 主要工具文件 settings.py: 配置文件 urls.py: url 定义及其指向 ...

  10. Load和CPU利用率是如何算出来的 (转发)

    本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/tech/system/how_to_cal ...