【Apache Thrift】Thrift的使用和编译(二)
电脑版发表于:2020/10/20 10:43
一、Thrift的使用
1.1基本类型
byte: 有符号字节
i16: 16位有符号整数
i32: 32位有符号整数
i64: 64位有符号整数
double: 64位浮点数
string: 字符串
1.2容器类型
list<T>: 一系列由T类型的数据组成的有序列表,元素可以重复
set<T>: 一系列由T类型的数据组成的无序集合,元素不可重复
map<K, V>: 一个字典结构,key为K类型,value为V类型,相当于Java中的HashMap<K,V>
exception RequestException {1: i32 code;2: string reason;}
service HelloWordService {// service中定义的函数,相当于Java interface中定义的函数string doAction(1: string name, 2: i32 age);}
1.7 类型定义
thrift支持类似C++一样的typedef定义,比如:typedef i32 Integertypedef i64 Long
注意:末尾没有逗号或者分号!
1.8 常量(const)
thrift也支持常量定义,使用const关键字,例如:const i32 MAX_RETRIES_TIME = 10const string MY_WEBSITE = "http://qifuguang.me";
末尾的分号是可选的,可有可无,并且支持16进制赋值
1.9 命名空间
thrift的命名空间相当于Java中的package的意思,主要目的是组织代码。thrift使用关键字namespace定义命名空间,例如:namespace java com.game.lll.thrift
提示: 格式是namespace 语言(Java) 路径(com.game.lll.thrift), 注意末尾不能有分号。
1.10 文件包含
thrift也支持文件包含,相当于C/C++中的include,Java中的import,C#中的using。使用关键字include定义,例 如:include "global.thrift"
1.11 注释
1.12 可选与必选
struct People {1: required string name;2: optional i32 age;}表示name是必填的,age是可选的。
namespace java com.game.lll.thriftstruct Request {1: string username;2: string password;}exception RequestException {1: required i32 code;2: optional string reason;}// 服务名service LoginService {string doAction(1: Request request) throws (1:RequestException qe); // 可能抛出异常。}
步骤二:在终端输入命令thrift -gen java login.thrift后会在当前目录下生成gen-java文件夹,该文件夹下会按照namespace定义的路径名一次一层层生成文件夹,到gen-java/com/game/lll/thrift/目录下可以看到生成的3个.java类。这是我的目录:
步骤三:服务器端分三步准备
2>在eclipse创建一个Java工程JavaThrift,并将上面的jar导入到工程里。
3>找到thrift-0.9.3\lib\java\src,将目录下的代码拷贝到JavaThrift工程里。
package com.game.lll.login;import org.apache.thrift.TException;import com.game.lll.thrift.LoginService;import com.game.lll.thrift.Request;import com.game.lll.thrift.RequestException;public class LoginServiceImpl implements LoginService.Iface{ @Override public String doAction(Request request) throws RequestException, TException { // TODO Auto-generated method stub System.out.println("username:"+request.getUsername()); System.out.println("password:"+request.getPassword()); return "aaa"; }}
步骤五:启动服务器
package com.game.lll.login;import java.net.ServerSocket;import org.apache.thrift.server.TServer;import org.apache.thrift.server.TSimpleServer;import org.apache.thrift.transport.TServerSocket;import com.game.lll.thrift.LoginService;import com.game.lll.thrift.LoginService.Processor;public class LoginMain { public static void main(String[] args) throws Exception {ServerSocket socket = new ServerSocket(8888);TServerSocket serverTransport = new TServerSocket(socket);LoginService.Processor processor = new Processor(new LoginServiceImpl());TServer.Args tServerArgs = new TServer.Args(serverTransport);tServerArgs.processor(processor);TServer server = new TSimpleServer(tServerArgs);System.out.println("Starting the simple server...");server.serve();}}步骤六:运行LoginMain,控制台输出结果
Starting the simple server...
步骤七:新建一个客户端ClientMain.java来访问服务端。代码如下:
package com.game.lll.login;import org.apache.thrift.protocol.TBinaryProtocol;import org.apache.thrift.protocol.TProtocol;import org.apache.thrift.transport.TSocket;import org.apache.thrift.transport.TTransport;import com.game.lll.thrift.LoginService;import com.game.lll.thrift.Request;public class ClientMain { public static void main(String[] args) throws Exception {TTransport transport = new TSocket("localhost", 8888);TProtocol protocol = new TBinaryProtocol(transport);// 创建clientLoginService.Client client = new LoginService.Client(protocol);transport.open(); // 建立连接// 第一种请求类型Request request = new Request().setUsername("liulongling").setPassword("123456");System.out.println(client.doAction(request));transport.close(); // 请求结束,断开连接}}
步骤八:测试结果