zoukankan      html  css  js  c++  java
  • Thrift 实现 JAVA,PHP,C#,Python 互相通信

    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文件

    namespace java com.penngo
    namespace php com.penngo
    namespace py com.penngo
    struct User {             定义的是一个结构体,用于同一的放回结果
        1: i64 id,
        2: string name,
        3: string password
    }
     
    service LoginService{    定义服务,服务先可以有多个方法,方法返回值为上面定义的结果User
        User login(1:string name, 2:string psw);
    } 
    
    service FaceService{     方法的返回值为 string类型
        string getFace(1:string name, 2:string psw);
    }
     
    service RegisterService{
        User createUser(1:string name, 2:string psw);
    }

    生成Python 版本的代码

    .	hrift-0.9.3.exe -gen  py .	est.thrift   //python
    .	hrift-0.9.3.exe -gen  csharp.	est.thrift  //C#
    .	hrift-0.9.3.exe -gen  java.	est.thrift    //java
    .	hrift-0.9.3.exe -gen  php.	est.thrift   //php

     

    就生成了这些代码

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

            try {
                TServerSocket serverTransport = new TServerSocket(8848);
                // 用户登录
                LoginService.Processor loginProcessor = new LoginService.Processor(
                        new LoginServiceImpl());
                //人脸识别
                FaceService.Processor faceProcessor=new FaceService.Processor(new FaceServiceImpl());
                // 用户注册
                RegisterService.Processor registerProcessor = new RegisterService.Processor(
                        new RegisterServiceImpl());
                
                
                 
                TMultiplexedProcessor processor = new TMultiplexedProcessor();
                
                processor.registerProcessor("LoginService", loginProcessor);
                processor.registerProcessor("RegisterService", registerProcessor);
                processor.registerProcessor("FaceService", faceProcessor);
                TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(
                        serverTransport).processor(processor));
                System.out.println("Starting server on port 8848 ...");
                server.serve();
            } catch (TTransportException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }



    public static void main(String args[]) {
    
    
    Server srv = new Server();
    
    
    srv.TMstart();
     
    }
     

    PHP客户端连接

    <?php
    namespace compenngo;
    
    require_once __DIR__.'/../../php/lib/Thrift/ClassLoader/ThriftClassLoader.php';        //按照自己的目录来,不能导入错了
    //echo __DIR__.'/../../lib/Thrift/ClassLoader/ThriftClassLoader.php';
    use ThriftClassLoaderThriftClassLoader;
    
    $GEN_DIR = realpath(dirname(__FILE__)).'/../../../gen-php';   //按照自己的目录来,不能导入错了
    
    
    
    $loader = new ThriftClassLoader();
    $loader->registerNamespace('Thrift', __DIR__ . '/../../php/lib');  //按照自己的目录来,不能导入错了,注册命名空间
    //$loader->registerDefinition('shared', $GEN_DIR);
    $loader->registerDefinition('com', $GEN_DIR);
    $loader->register();
    
    if (php_sapi_name() == 'cli') {
        ini_set("display_errors", "stderr");
    }
    
    use ThriftProtocolTBinaryProtocol;
    use ThriftProtocolTMultiplexedProtocol;
    use ThriftTransportTSocket;
    use ThriftTransportTHttpClient;
    use ThriftTransportTBufferedTransport;
    use ThriftExceptionTException;
    use compenngoRegisterServiceClient;
    use compenngoLoginServiceClient;
    
    try {
    
        $socket = new TSocket('127.0.0.1', 8848);
        $socket->setSendTimeout(100000);   //设置超时时间
        $socket->setRecvTimeout(100000);
    
        $transport = new TBufferedTransport($socket, 1024, 1024);
        $protocol = new TBinaryProtocol($transport);
    //    $loginProtocol = new TMultiplexedProtocol($protocol, "LoginService");
        $faceProtocol = new TMultiplexedProtocol($protocol, "FaceService");
        // $registerProtocol = new TMultiplexedProtocol($protocol, "RegisterService");
        $faceClient = new FaceServiceClient($faceProtocol);
        // $registerClient = new RegisterServiceClient($registerProtocol);
        $transport->open();
    
        $faceinfo = $faceClient->getFace("123","asdasd");
    
        print_r($faceinfo);
    
        $transport->close();
    } catch (TException $tx) {
        print 'TException: '.$tx->getMessage()."
    ";
        print 'TException: '.$tx->getTraceAsString()."
    ";
    }

    Python 客户端

    安装Python 插件

    pip install thrift
    # -*- coding:utf-8 -*-  
    import sys
    sys.path.append('..')
    
    from thrift.TMultiplexedProcessor import TMultiplexedProcessor
    from thrift.protocol.TMultiplexedProtocol import TMultiplexedProtocol
    from thrift.transport import TSocket
    from thrift.transport import TTransport
    from thrift.protocol import TBinaryProtocol
    from thrift.server import TServer
    #根据实际的包结构去引入
    import FaceService
    
    
    
        
    
    def client():
        transport = TSocket.TSocket(host='localhost', port=8848) 
        transport = TTransport.TBufferedTransport(transport) 
        protocol = TBinaryProtocol.TBinaryProtocol(transport) 
        face_protocol = TMultiplexedProtocol(protocol, "FaceService") #如果服务端使用TMultiplexedProcessor接收处理,客户端必须用TMultiplexedProtocol并且指定serviceName和服务端的一致 
            
        face_client = FaceService.Client(face_protocol)#msg客户端 
            
        transport.open() 
        
        print face_client.getFace("123","啊实打实多")
            
        transport.close()
    
    
     
    if __name__ == '__main__':
        client()
        

    C# 客户端

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

    dll 下载,然后引用

    using Thrift.Protocol;
    using Thrift.Server;
    using Thrift.Transport;

    public void TMclient() { TSocket transport = new TSocket("127.0.0.1",8848); TBinaryProtocol protocol = new TBinaryProtocol(transport); TMultiplexedProtocol tprocessor = new TMultiplexedProtocol(protocol, "FaceService"); FaceService.Client faceclient = new FaceService.Client(tprocessor); transport.Open(); String info=faceclient.getFace("PHP","JAVA"); Console.WriteLine(info); transport.Close(); }

    结束

    !!

  • 相关阅读:
    C++命名规则
    protobuf_1
    以太网帧格式
    LinQ
    asp.mvc 基本知识
    Lucene.Net 优化索引生成,即搜索显示优化
    HTML Meta中添加X-UA-Compatible和IE=Edge,chrome=1有什么作用
    DataSet
    伪Excel导出新版代码
    WebUI 常用
  • 原文地址:https://www.cnblogs.com/wlphp/p/10339099.html
Copyright © 2011-2022 走看看