zoukankan      html  css  js  c++  java
  • Thrift Server与Client

    thrift教程中提供了客户端和服务端的简单实现。

    Client

          
          TTransport transport;
          if (args[0].contains("simple")) {
    	    //socket通信
            transport = new TSocket("localhost", 9090);
            transport.open();
          }
          else {
            TSSLTransportParameters params = new TSSLTransportParameters();
            params.setTrustStore("../../lib/java/test/.truststore", "thrift", "SunX509", "JKS");
            //加密的通信方式
            transport = TSSLTransportFactory.getClientSocket("localhost", 9091, 0, params);
          }
          //定义数据传输协议并绑定transport
          TProtocol protocol = new  TBinaryProtocol(transport);
    	  //使用transport创建客户端
          Calculator.Client client = new Calculator.Client(protocol);
    	  //使用生成的client进行调用
          perform(client);
          //关闭transport
          transport.close();
    

    对定义的thrift文件,会有一个Iface接口内部是所有接口的定义,Client就实现了这个生成的接口
    比如有一个方法public String aaa(String param)
    在Client的实现中就会有

        public Obj aaa(String name) throws org.apache.thrift.TException
        {
          send_aaa(name);
          return recv_aaa();
        }
    

    send_XXX的方法会使用构造时传入的protocol进行write,recv_XXX方法会使用构造传入的protocol进行读取并组装到返回结果中,这里发送和传输的protocol是一样的,但是可以手动继承生成的Client类使用不同的protocol

    Server

    这里只看下simple的server

    
      public static CalculatorHandler handler;
      public static Calculator.Processor processor;
      
      public static void simple(Calculator.Processor processor) {
        try {
    	  //自定义的实现
    	  handler = new CalculatorHandler();
    	  //注册handler到processor中
          processor = new Calculator.Processor(handler);
    
    	  //定义Socket通讯方式的ServerTransport(和TTransport不同)
          TServerTransport serverTransport = new TServerSocket(9090);
    	  //创建server,这里只注册了ServerTransport,TTransport和TProtocol都使用默认(TServerTransport对应的TTransport 和 TBinaryProtocol),并注册processor
          TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
    
          // 多线程server
          // TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));
    
          System.out.println("Starting the simple server...");
    	  //启动server
          server.serve();
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    

    在server的serve方法中会监听TServerTransport,当接受到消息时会调用processor的各个方法的getResult方法进行处理,再写回结果。

  • 相关阅读:
    [APIO2018]铁人两项 --- 圆方树
    SPOJ1811 && SPOJ1812
    [BZOJ4627][BeiJing2016]回转寿司(线段树)
    NOIP2018提高组题解
    [BZOJ4340][BJOI2015]隐身术(后缀数组)
    [BZOJ4338][BJOI2015]糖果(扩展Lucas)
    [BZOJ4336][BJOI2015]骑士的旅行(树链剖分+线段树)
    [BZOJ4419][SHOI2013]发微博
    [BZOJ2878][NOI2012]迷失游乐园(环套树DP+概率)
    [BZOJ1791][IOI2008]Island岛屿(环套树DP)
  • 原文地址:https://www.cnblogs.com/resentment/p/7498713.html
Copyright © 2011-2022 走看看