Thrift介绍   https://www.ibm.com/developerworks/cn/java/j-lo-apachethrift/index.html

首先需要下载 Thrift.exe 和Thrift的源码包,C# Thrift.dll  java Thrift jar包

全部放在码云上面了 https://gitee.com/bandung/Allthrift.git

定义一个thrift文件

  1. namespace java com.penngo
  2. namespace php com.penngo
  3. namespace py com.penngo
  4. struct User { 定义的是一个结构体,用于同一的放回结果
  5. : i64 id,
  6. : string name,
  7. : string password
  8. }
  9.  
  10. service LoginService{ 定义服务,服务先可以有多个方法,方法返回值为上面定义的结果User
  11. User login(:string name, :string psw);
  12. }
  13.  
  14. service FaceService{ 方法的返回值为 string类型
  15. string getFace(:string name, :string psw);
  16. }
  17.  
  18. service RegisterService{
  19. User createUser(:string name, :string psw);
  20. }

生成Python 版本的代码

  1. .\thrift-0.9..exe -gen py .\test.thrift //python
  2. .\thrift-0.9..exe -gen csharp.\test.thrift //C#
  3. .\thrift-0.9..exe -gen java.\test.thrift //java
  4. .\thrift-0.9..exe -gen php.\test.thrift   //php

就生成了这些代码

就简单举拿JAVA 做服务端,其他都是客户端的例子把,启动之后监听了8848端口,多线程模式的,单线程IO阻塞的在git 里面有

  1. try {
  2. TServerSocket serverTransport = new TServerSocket(8848);
  3. // 用户登录
  4. LoginService.Processor loginProcessor = new LoginService.Processor(
  5. new LoginServiceImpl());
  6. //人脸识别
  7. FaceService.Processor faceProcessor=new FaceService.Processor(new FaceServiceImpl());
  8. // 用户注册
  9. RegisterService.Processor registerProcessor = new RegisterService.Processor(
  10. new RegisterServiceImpl());
  11.  
  12. TMultiplexedProcessor processor = new TMultiplexedProcessor();
  13.  
  14. processor.registerProcessor("LoginService", loginProcessor);
  15. processor.registerProcessor("RegisterService", registerProcessor);
  16. processor.registerProcessor("FaceService", faceProcessor);
  17. TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(
  18. serverTransport).processor(processor));
  19. System.out.println("Starting server on port 8848 ...");
  20. server.serve();
  21. } catch (TTransportException e) {
  22. e.printStackTrace();
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. }
public static void main(String args[]) {
  1.  
Server srv = new Server();
  1.  
srv.TMstart();
 
}
  1.  

PHP客户端连接

  1. <?php
  2. namespace com\penngo;
  3.  
  4. require_once __DIR__.'/../../php/lib/Thrift/ClassLoader/ThriftClassLoader.php'; //按照自己的目录来,不能导入错了
  5. //echo __DIR__.'/../../lib/Thrift/ClassLoader/ThriftClassLoader.php';
  6. use Thrift\ClassLoader\ThriftClassLoader;
  7.  
  8. $GEN_DIR = realpath(dirname(__FILE__)).'/../../../gen-php'; //按照自己的目录来,不能导入错了
  9.  
  10. $loader = new ThriftClassLoader();
  11. $loader->registerNamespace('Thrift', __DIR__ . '/../../php/lib'); //按照自己的目录来,不能导入错了,注册命名空间
  12. //$loader->registerDefinition('shared', $GEN_DIR);
  13. $loader->registerDefinition('com', $GEN_DIR);
  14. $loader->register();
  15.  
  16. if (php_sapi_name() == 'cli') {
  17. ini_set("display_errors", "stderr");
  18. }
  19.  
  20. use Thrift\Protocol\TBinaryProtocol;
  21. use Thrift\Protocol\TMultiplexedProtocol;
  22. use Thrift\Transport\TSocket;
  23. use Thrift\Transport\THttpClient;
  24. use Thrift\Transport\TBufferedTransport;
  25. use Thrift\Exception\TException;
  26. use com\penngo\RegisterServiceClient;
  27. use com\penngo\LoginServiceClient;
  28.  
  29. try {
  30.  
  31. $socket = new TSocket('127.0.0.1', 8848);
  32. $socket->setSendTimeout(100000); //设置超时时间
  33. $socket->setRecvTimeout(100000);
  34.  
  35. $transport = new TBufferedTransport($socket, 1024, 1024);
  36. $protocol = new TBinaryProtocol($transport);
  37. // $loginProtocol = new TMultiplexedProtocol($protocol, "LoginService");
  38. $faceProtocol = new TMultiplexedProtocol($protocol, "FaceService");
  39. // $registerProtocol = new TMultiplexedProtocol($protocol, "RegisterService");
  40. $faceClient = new FaceServiceClient($faceProtocol);
  41. // $registerClient = new RegisterServiceClient($registerProtocol);
  42. $transport->open();
  43.  
  44. $faceinfo = $faceClient->getFace("123","asdasd");
  45.  
  46. print_r($faceinfo);
  47.  
  48. $transport->close();
  49. } catch (TException $tx) {
  50. print 'TException: '.$tx->getMessage()."\n";
  51. print 'TException: '.$tx->getTraceAsString()."\n";
  52. }

Python 客户端

安装Python 插件

  1. pip install thrift
  1. # -*- coding:utf-8 -*-
  2. import sys
  3. sys.path.append('..')
  4.  
  5. from thrift.TMultiplexedProcessor import TMultiplexedProcessor
  6. from thrift.protocol.TMultiplexedProtocol import TMultiplexedProtocol
  7. from thrift.transport import TSocket
  8. from thrift.transport import TTransport
  9. from thrift.protocol import TBinaryProtocol
  10. from thrift.server import TServer
  11. #根据实际的包结构去引入
  12. import FaceService
  13.  
  14. def client():
  15. transport = TSocket.TSocket(host='localhost', port=8848)
  16. transport = TTransport.TBufferedTransport(transport)
  17. protocol = TBinaryProtocol.TBinaryProtocol(transport)
  18. face_protocol = TMultiplexedProtocol(protocol, "FaceService") #如果服务端使用TMultiplexedProcessor接收处理,客户端必须用TMultiplexedProtocol并且指定serviceName和服务端的一致
  19.  
  20. face_client = FaceService.Client(face_protocol)#msg客户端
  21.  
  22. transport.open()
  23.  
  24. print face_client.getFace("","啊实打实多")
  25.  
  26. transport.close()
  27.  
  28. if __name__ == '__main__':
  29. client()

C# 客户端

https://gitee.com/bandung/Allthrift/raw/master/gen-csharp/gen-csharp/bin/Debug/Thrift.dll

dll 下载,然后引用

  1. using Thrift.Protocol;
    using Thrift.Server;
    using Thrift.Transport;
  2.  
  3. public void TMclient()
  4. {
  5.  
  6. TSocket transport = new TSocket("127.0.0.1",);
  7.  
  8. TBinaryProtocol protocol = new TBinaryProtocol(transport);
  9.  
  10. TMultiplexedProtocol tprocessor = new TMultiplexedProtocol(protocol, "FaceService");
  11.  
  12. FaceService.Client faceclient = new FaceService.Client(tprocessor);
  13.  
  14. transport.Open();
  15.  
  16. String info=faceclient.getFace("PHP","JAVA");
  17.  
  18. Console.WriteLine(info);
  19.  
  20. transport.Close();
  21.  
  22. }

结束

!!

Thrift 实现 JAVA,PHP,C#,Python 互相通信的更多相关文章

  1. 《精通并发与Netty》学习笔记(07 - 基于Thrift实现Java与Python的RPC调用)

    上节我们介绍了基于Thrift实现java与java的RPC调用,本节我们基于Thrift实现Java与Python的RPC调用 首先,修改data.thirft文件,将命名空间由java改为py n ...

  2. Apache Thrift with Java Quickstart(thrift入门及Java实例)

    thrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl ...

  3. Atitit.http代理的实现 代码java php c# python

    Atitit.http代理的实现 代码java php c# python 1. 代理服务器用途 代理服务器看成是一种扩展浏览器功能的途径.例如,在把数据发送给浏览器之前,可以用代理服务器压缩数据 调 ...

  4. Atitit.异步编程 java .net php python js 对照

    Atitit.异步编程 java .net php python js 的比較 1. 1.异步任务,异步模式,  APM模式,,  EAP模式, TAP 1 1.1.       APM模式: Beg ...

  5. 利用thrift rpc进行C++与Go的通信

    一:什么是rpc rpc通俗来理解就是远程调用函数,相对于本地调用来说,只需要在主调函数中调用被掉函数即可,代码如下: void fun(int i) { cout << "fu ...

  6. Atitit.异步编程 java .net php python js 的比较

    Atitit.异步编程 java .net php python js 的比较 1. 1.异步任务,异步模式,  APM模式,,  EAP模式, TAP 1 1.1.       APM模式: Beg ...

  7. 我看不下去鸟。。。。Java和C#的socket通信真的简单吗?

    这几天在博客园上看到好几个写Java和C#的socket通信的帖子.但是都为指出其中关键点. C# socket通信组件有很多,在vs 使用nuget搜索socket组件有很多类似的.本人使用的是自己 ...

  8. Thrift-java实例

    ➠更多技术干货请戳:听云博客 Thrift实例1 功能描述:客户端与服务器端分别是两个应用,先启动服务器端,再启动客户端,实现执行客户端运行服务器端的加法方法. 源码截图(源码在附件中): 客户端: ...

  9. 为什么用 Java:一个 Python 程序员告诉你

    这篇文章专门给程序员写的,普通读者慎入.原作者:Kevin Sookocheff 译者:Celia Zhen,原文点击文末链接. 每当我告诉别人我一直在用Java工作时,大家的反应都是: “纳尼!Ja ...

随机推荐

  1. istringstream、ostringstream、stringstream类介绍

    本文转载自: http://www.cnblogs.com/gamesky/archive/2013/01/09/2852356.html 一.C++的输入输出分为三种: (1)基于控制台的I/O ( ...

  2. L194

    For many of us, asking for help is it difficult concept. We may feel as if we are admitting a weakne ...

  3. react native遇到的坑

    1.模拟器报错no bundle url present https://github.com/facebook/react-native/issues/12754 http://www.cnblog ...

  4. axios请求requestBody和formData

    前言 在vue的后台管理开发中,应需求,需要对信息做一个校验,需要将参数传递两份过去,一份防止在body中,一份防止在formdata中,axios请求会默认将参数放在formdata中进行发送. 对 ...

  5. Linux 中同名进程的查杀

    长久一段时间没有做任何工作总结了,如果用工作忙来敷衍那是欺骗自己,承认这一段时间拒绝进步了. 在系统运维中,有许多同名进程需要kill是常有的事情, 数一下battle这个进程的数量 [root@HD ...

  6. 离散数学:用C语言来判断集合存在的二元关系

    用C语言来判断是否满足自反,反自反,非自反,对称,反对称,非对称和传递性 也不知道写的对不对.没有大量验证,但是随便找的一些关系测试的没毛病,如果错了,欢迎各位大佬留言 #include<bit ...

  7. 《DSP using MATLAB》示例 Example 9.11

    代码: %% ------------------------------------------------------------------------ %% Output Info about ...

  8. 微信后端服务架构及其过载控制系统DAGOR

    微信架构介绍   眼下的微信后端包含3000多个移动服务,包括即时消息.社交网络.移动支付和第三方授权.该平台每天收到的外部请求在10 ^10个至10^11个.每个这样的请求都会触发多得多的内部微服务 ...

  9. Android自动化测试-UiAutomator2环境搭建

    Android自动化测试-UiAutomator环境搭建(QQ交流群:490451176) 一.环境准备 1. 安装android sdk,并配置环境变量 2. 安装android studio,国内 ...

  10. GNU Radio: USRP2 and N2x0 Series

    Comparative features list 相对性能清单 Hardware Capabilities: 1 transceiver card slot External PPS referen ...