IDEA Java Thrift Hello world-猫

xiaoxiao2021-02-28  121

一、环境与配置

1.操作系统Win10

2.IDEA Java

3.Thrift version 0.10.0

二、准备工作

1.下载 thrift.exe 文件(本文附件中)

2.配置环境变量 

D盘创建文件夹 thrift  把 thrift.exe 文件放在下面 D:\thrift\thrift.exe

3.Maven 中加入 lib 库

 

<dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.10.0</version> </dependency>

4.命令行下输入 thrift -version 检测是否配置成功

三、生成相应语言代码

1. 创建 .thrift 文件

目录结构

 

Hello.thrift

 

namespace java com.dokee.manager.core.thrift enum RequestType { SAY_HELLO, //问好 QUERY_TIME, //询问时间 } struct HelloWordRequest { 1: required RequestType type; // 请求的类型,必选 2: required string name; // 发起请求的人的名字,必选 3: optional i32 age; // 发起请求的人的年龄,可选 } exception RequestException { 1: required i32 code; 2: optional string reason; } // 服务名 service HelloWordHandle { string doAction(1: HelloWordRequest request) throws (1:RequestException qe); // 可能抛出异常。 }

 

基本语法与详细介绍请参考

http://www.jianshu.com/p/0f4113d6ec4b

2.生成对应代码

命令行下 cd 到 对应.thrift 文件目录中 ,然后输入 thrift --gen javaHello.thrift

会输出对应语言的代码

3.实现对应接口 

实现thrift 命令中生成的 接口 HelloWordHandle.Iface HelloWordHandleImpl.java package com.dokee.manager.core.thrift.impl; import com.dokee.manager.core.thrift.HelloWordHandle; import com.dokee.manager.core.thrift.HelloWordRequest; import com.dokee.manager.core.thrift.RequestException; import com.dokee.manager.core.thrift.RequestType; import org.apache.thrift.TException; import org.common5iq.util.Utils; import java.util.Date; public class HelloWordHandleImpl implements HelloWordHandle.Iface { // 实现这个方法完成具体的逻辑。 public String doAction(HelloWordRequest request) throws RequestException, TException { System.out.println("Get request: " + request); if (Utils.isBlank(request.getName()) || request.getType() == null) { throw new RequestException(); } String result = "Hello, " + request.getName(); if (request.getType() == RequestType.SAY_HELLO) { result += ", Welcome!"; } else { result += ", Now is " + new Date().toLocaleString(); } return result; } }

 

四、测试

1.创建服务器端

此次用java作为服务器端  HelloWordServer.java  也可用C++作为服务器端来测试

 

import org.apache.thrift.TProcessor; import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TCompactProtocol; import org.apache.thrift.server.TServer; import org.apache.thrift.server.TThreadedSelectorServer; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TNonblockingServerSocket; /** * @author qifuguang * @date 15/9/11 16:07 */ public class HelloWordServer { public static final int SERVER_PORT = 8989; public static void main(String[] args) throws Exception { TProcessor tprocessor = new HelloWordHandle.Processor(new HelloWordHandleImpl()); // 传输通道 - 非阻塞方式 TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(SERVER_PORT); //多线程半同步半异步 TThreadedSelectorServer.Args tArgs = new TThreadedSelectorServer.Args(serverTransport); tArgs.processor(tprocessor); tArgs.transportFactory(new TFramedTransport.Factory()); //二进制协议 tArgs.protocolFactory(new TCompactProtocol.Factory()); // 多线程半同步半异步的服务模型 TServer server = new TThreadedSelectorServer(tArgs); System.out.println("HelloTThreadedSelectorServer start...."); server.serve(); // 启动服务 } }(new HelloWordHandleImpl()); // 传输通道 - 非阻塞方式 TNonblockingServerSocket serverTransport = new TNonblockingServerSocket(SERVER_PORT); //多线程半同步半异步 TThreadedSelectorServer.Args tArgs = new TThreadedSelectorServer.Args(serverTransport); tArgs.processor(tprocessor); tArgs.transportFactory(new TFramedTransport.Factory()); //二进制协议 tArgs.protocolFactory(new TCompactProtocol.Factory()); // 多线程半同步半异步的服务模型 TServer server = new TThreadedSelectorServer(tArgs); System.out.println("HelloTThreadedSelectorServer start...."); server.serve(); // 启动服务 } }   运行 HelloWordServer.java   控制台打印     2.创建 HelloClient.java   import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.protocol.TCompactProtocol; import org.apache.thrift.protocol.TProtocol; import org.apache.thrift.transport.TFramedTransport; import org.apache.thrift.transport.TSocket; import org.apache.thrift.transport.TTransport; /** * @author qifuguang * @date 15/9/11 16:13 */ public class HelloWordClient { public static final String SERVER_IP = "localhost"; public static final int SERVER_PORT = 8989; public static final int TIMEOUT = 30000; public static void main(String[] args) throws Exception { //设置传输通道,对于非阻塞服务,需要使用TFramedTransport,它将数据分块发送 TTransport transport = new TFramedTransport(new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT)); //使用高密度二进制协议 TProtocol protocol = new TCompactProtocol(transport); // 创建client HelloWordHandle.Client client = new HelloWordHandle.Client(protocol); transport.open(); // 建立连接 // 第一种请求类型 HelloWordRequest request = new HelloWordRequest() .setType(RequestType.SAY_HELLO).setName("winwill2012").setAge(24); System.out.println(client.doAction(request)); // 第二种请求类型 request.setType(RequestType.QUERY_TIME).setName("winwill2012"); System.out.println(client.doAction(request)); transport.close(); // 请求结束,断开连接 } } 运行 HelloClient.java 控制台打印           五、注意事项   1.客户端与服务器端传输协议一致 同时使用 TCompactProtocol 或者 TBinaryProtocol 不一直会报错 2.文件下载 Hello.thrift 等文件 以及 生成的相关代码 , 链接: https://pan.baidu.com/s/1kVaGT6Z 密码: zeuq 链接: https://pan.baidu.com/s/1hsOmaaS 密码: fqqq    

 

 

 

 

 

 

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-20475.html

最新回复(0)