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方法进行处理,再写回结果。