java学习总结——Apache thrift服务端与客户端的创建

这篇博客总结了如何使用Apache Thrift创建服务端和客户端。首先介绍了通过Thrift文件生成代码的过程,该过程需要一个C++的编译环境。接着提供了获取Thrift文件的链接,并强调不同版本的Thrift在编写客户端和服务端代码时存在差异,但核心涉及TTransport、TProtocol和TServer组件。最后,提到了Thrift服务端创建的要点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

thrift的使用分为三个步骤:
1、创建接口描述文件,即demo.thrift文件;

2、通过thrift文件生成代码。(这个过程需要安装thrift的编译环境,过程有些繁琐。thrift使用C++编写的,所以编译环境是C++的环境。编译环境教程可以网上找,挺多的。)

生成代码命令:thrift -r -gen java -out "生成代码所在目录(目录必须存在)"  thriftFileName。
			-r  : 递归寻找文件,一般在thrift文件中有引用其他文件的thrift文件时使用
			-gen :指定生成的目标语言
			-out :执行生成源代码的路径,也可以不指定,默认当前目录

注:1、用于生成代码的thrift文件可以在如下链接中获得:点击打开链接

3、编写服务端和客户端。(使用的是org.apache.thrift-0.11.0版本,不同版本的在客户端与服务端代码编写时,代码会有差异,但是核心都是由TTransport,TProtocol,TServer三个部分组成的。

thrift服务端的创建:

//根据生成的代码创建processor。
//注:CalculatorHandler实现了Calculator.Iface接口,自定义了接口方法实现。
//    Calculator.Iface是根据thrift文件中的定义内容生成的,需要自行成代码

CalculatorHandler handler = new CalculatorHandler();
Calculator.Processor processor = new Calculator.Processor(handler);


//服务端的创建,下面的每一个方法都一种服务端的创建方式,在外部直接调用就可以启动服务
public static void simple(Calculator.Processor processor) throws Exception{
	TServerTransport tServerTransport = new TServerSocket(9090);

	TServer tServer = new TSimpleServer(new TServer.Args(tServerTransport)
			.processor(processor) //Transport和Protocol,客户端与服务端应该保持一致
			.inputProtocolFactory(new TCompactProtocol.Factory())
			.outputProtocolFactory(new TCompactProtocol.Factory())
			.inputTransportFactory(new TZlibTransport.Factory())
			.outputTransportFactory(new TZlibTransport.Factory()));
	System.out.println("listen port 9090,Starting the simple server...");
	tServer.serve();
}

public static void noblock(Calculator.Processor processor) throws Exception{
	/**
	 * 非阻塞的socket,必须使用TFramedTransport和TCompactProtocol
	 * 作为其Transport和Protocol
	 */
	TNonblockingServerSocket socket = new TNonblockingServerSocket(9092);
	TFramedTransport.Factory tframeFactory = new TFramedTransport.Factory();
	TCompactProtocol.Factory tCompactProtocol = new TCompactProtocol.Factory();
	TServer server = new THsHaServer(
			new THsHaServer.Args(socket)
					.processor(processor)//Transport和Protocol,客户端与服务端应该保持一致
					.inputProtocolFactory(tCompactProtocol)
					.inputTransportFactory(tframeFactory)
					.outputProtocolFactory(tCompactProtocol)
					.outputTransportFactory(tframeFactory));
	System.out.println("listen port 9092,Starting the noblock server...");
	server.serve();
}

public static void asynServer(Calculator.Processor processor)  throws  Exception{
	/**
	 * 非阻塞的socket,必须使用TFramedTransport和TCompactProtocol
	 * 作为其Transport和Protocol
	 */
	TNonblockingServerSocket tServerTransport = new TNonblockingServerSocket(9093);
	TServer tServer = new TThreadedSelectorServer(new TThreadedSelectorServer.Args(tServerTransport)
			.processor(processor)//Transport和Protocol,客户端与服务端应该保持一致
			.inputProtocolFactory(new TCompactProtocol.Factory())
			.outputProtocolFactory(new TCompactProtocol.Factory())
			.inputTransportFactory(new TFramedTransport.Factory())
			.outputTransportFactory(new TFramedTransport.Factory()));
	System.out.println("listen port 9093,Starting the asynServer server...");
	tServer.serve();
}

public static void asynThreadPoolServer(Calculator.Processor processor)  throws  Exception{
	TNonblockingServerSocket tServerTransport = new TNonblockingServerSocket(9094);
	TServer tServer = new TThreadPoolServer(new TThreadPoolServer.Args(tServerTransport)
			.processor(processor)
			.inputProtocolFactory(new TCompactProtocol.Factory())
			.outputProtocolFactory(new TCompactProtocol.Factory())
			.inputTransportFactory(new TFastFramedTransport.Factory())
			.outputTransportFactory(new TFastFramedTransport.Factory()));
	System.out.println("listen port 9094,Starting the asynThreadPoolServer server...");
	tServer.serve();
}

public static void tNonblockingServer(Calculator.Processor processor)  throws  Exception{
	TNonblockingServerSocket tServerTransport = new TNonblockingServerSocket(9095);
	TServer tServer = new TNonblockingServer(new TNonblockingServer.Args(tServerTransport)
			.processor(processor)//Transport和Protocol,客户端与服务端应该保持一致
			.inputProtocolFactory(new TCompactProtocol.Factory())
			.outputProtocolFactory(new TCompactProtocol.Factory())
			.inputTransportFactory(new TFastFramedTransport.Factory())
			.outputTransportFactory(new TFastFramedTransport.Factory()));
	System.out.println("listen port 9095,Starting the tNonblockingServer server...");
	tServer.serve();
}
thrfit客户端的创建:

/**同步调用的客户端*/
	TTransport  tTransport= new TSocket("localhost",9092);
	tTransport = new TFramedTransport.Factory().getTransport(tTransport);
	tTransport.open();

	TProtocol tProtocol = new TCompactProtocol(tTransport);

	//注:创建服务端,调用方法。Calculator类和Work类都是根据thrift文件生成的类
	Calculator.Client client = new Calculator.Client(tProtocol);
	Work work = new Work();
	work.op = Operation.DIVIDE;
	work.num1 = 1;
	work.num2 = 0;

	try {
		int calculate = client.calculate(1, work);
		System.out.println("Whoa we can divide by 0");
	}catch (invalidOperation ex ){
		System.out.println("Invalid operation: " + ex.why);
	}
	
/**异步调用的客户端*/
	TAsyncClientManager clientManager = new TAsyncClientManager();
	TProtocolFactory protocolFactory = new TCompactProtocol.Factory();
	TNonblockingSocket socket = new TNonblockingSocket("localhost",9093);
	Calculator.AsyncClient client = new Calculator.AsyncClient(protocolFactory,clientManager,socket);
	ResultHandler resultHandler = new ResultHandler(); //自定义类,用户回调处理,实现了AsyncMethodCallback接口

	Work work = new Work();
	work.op = Operation.SUBTRACT;
	work.num1 = 15;
	work.num2 = 10;

	try {
		client.calculate(1, work,resultHandler);
	}catch (invalidOperation ex ){
		System.out.println("Invalid operation: " + ex.why);
	}
	Thread.sleep(5000);//需要等待返回,不然客户端会直接结束;客户端结束后就接收不到返回的结果了




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值