thrift教程中提供了客户端和服务端的简单实现。java
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的实现中就会有apache
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多线程
这里只看下simple的serversocket
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方法进行处理,再写回结果。ui