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