【Apache Thrift】Thrift的使用和编译(二)

来源:互联网 发布:mysql学生管理系统 编辑:程序博客网 时间:2024/06/05 01:07

一、Thrift的使用

   1.1基本类型

  thrift不支持无符号类型,因为很多编程语言不存在无符号类型,比如Java

  • byte: 有符号字节
  • i16: 16位有符号整数
  • i32: 32位有符号整数
  • i64: 64位有符号整数
  • double: 64位浮点数
  • string: 字符串

   1.2容器类型

  集合中的元素可以是除了service之外的任何类型,包括exception。

  • list<T>: 一系列由T类型的数据组成的有序列表,元素可以重复
  • set<T>: 一系列由T类型的数据组成的无序集合,元素不可重复
  • map<K, V>: 一个字典结构,key为K类型,value为V类型,相当于Java中的HashMap<K,V>

   1.3 结构体(struct)

  就像C语言一样,thrift也支持struct类型,目的就是将一些数据聚合在一起,方便传输管理。struct的定义形式如下:
[objc] view plain copy
  1. struct NPC  
  2. {  
  3.     1:i32 id;  
  4.     2:string name;   
  5. }  

   1.4 枚举

  枚举的定义形式和Java的Enum定义差不多,例如:

[java] view plain copy
  1. enum Action {  
  2.     Idle,  
  3.       Attack,  
  4.     Run   
  5. }  

   1.5 异常(exception)

  thrift支持自定义exception,规则和struct一样,如下:
[objc] view plain copy
  1. exception RequestException {  
  2.     1: i32 code;  
  3.     2: string reason;  
  4. }  

   1.6 服务(service)

  thrift定义服务相当于Java中创建Interface一样,创建的service经过代码生成命令之后就会生成客户端和服务端的框架代码。定义形式如下:
[java] view plain copy
  1. service HelloWordService {  
  2.      // service中定义的函数,相当于Java interface中定义的函数  
  3.      string doAction(1: string name, 2: i32 age);  
  4.  }  

   1.7 类型定义

  thrift支持类似C++一样的typedef定义,比如:
[cpp] view plain copy
  1. typedef i32 Integer  
  2. typedef i64 Long  
注意:末尾没有逗号或者分号!

   1.8 常量(const)

  thrift也支持常量定义,使用const关键字,例如:
[cpp] view plain copy
  1. const i32 MAX_RETRIES_TIME = 10  
  2. const string MY_WEBSITE = "http://qifuguang.me";  

末尾的分号是可选的,可有可无,并且支持16进制赋值

   1.9 命名空间

  thrift的命名空间相当于Java中的package的意思,主要目的是组织代码。thrift使用关键字namespace定义命名空间,例如:
[java] view plain copy
  1. namespace java com.game.lll.thrift  

提示:格式是namespace 语言(Java)  路径(com.game.lll.thrift), 注意末尾不能有分号。

   1.10 文件包含

  thrift也支持文件包含,相当于C/C++中的include,Java中的import,C#中的using。使用关键字include定义,例 如:
[cpp] view plain copy
  1. include "global.thrift"  

   1.11 注释

  thrift注释方式支持shell风格的注释,支持C/C++风格的注释,即#和//开头的语句都单当做注释,/**/包裹的语句也是注释。

   1.12 可选与必选

  thrift提供两个关键字required,optional,分别用于表示对应的字段时必填的还是可选的。例如:

[cpp] view plain copy
  1. struct People {  
  2.     1: required string name;  
  3.     2: optional i32 age;  
  4. }  
 表示name是必填的,age是可选的。

二、Thrift编译

   2.1 代码示例

  步骤一:创建一个文件,代码如下:
[java] view plain copy
  1. namespace java com.game.lll.thrift  
  2.   
  3. struct Request {  
  4.     1: string username;        
  5.     2: string password;             
  6. }  
  7.   
  8. exception RequestException {  
  9.     1: required i32 code;  
  10.     2: optional string reason;  
  11. }  
  12.   
  13. // 服务名  
  14. service LoginService {  
  15.     string doAction(1: Request request) throws (1:RequestException qe); // 可能抛出异常。  
  16. }  

  步骤二:在终端输入命令thrift -gen java login.thrift后会在当前目录下生成gen-java文件夹,该文件夹下会按照namespace定义的路径名一次一层层生成文件夹,到gen-java/com/game/lll/thrift/目录下可以看到生成的3个.java类。这是我的目录:

  步骤三:服务器端分三步准备

     1>下载jar包

  • org.slf4j.api_1.6.4.jar
  • org.apache.http目录下所有jar包
  • javax.servlet目录下所有jar包
      2>在eclipse创建一个Java工程JavaThrift,并将上面的jar导入到工程里。

      3>找到thrift-0.9.3\lib\java\src,将目录下的代码拷贝到JavaThrift工程里。

  步骤四:创建LoginServiceImpl.java类将它实现LoginService.Iface接口,代码如下:
[java] view plain copy
  1. package com.game.lll.login;  
  2. import org.apache.thrift.TException;  
  3.   
  4. import com.game.lll.thrift.LoginService;  
  5. import com.game.lll.thrift.Request;  
  6. import com.game.lll.thrift.RequestException;  
  7.   
  8. public class LoginServiceImpl implements LoginService.Iface{  
  9.   
  10.     @Override  
  11.     public String doAction(Request request) throws RequestException, TException {  
  12.         // TODO Auto-generated method stub  
  13.         System.out.println("username:"+request.getUsername());  
  14.         System.out.println("password:"+request.getPassword());  
  15.         return "aaa";  
  16.     }  
  17.   
  18. }  
  步骤五:启动服务器
[java] view plain copy
  1. package com.game.lll.login;  
  2.   
  3. import java.net.ServerSocket;  
  4.   
  5. import org.apache.thrift.server.TServer;  
  6. import org.apache.thrift.server.TSimpleServer;  
  7. import org.apache.thrift.transport.TServerSocket;  
  8.   
  9. import com.game.lll.thrift.LoginService;  
  10. import com.game.lll.thrift.LoginService.Processor;  
  11.   
  12. public class LoginMain {  
  13.     public static void main(String[] args) throws Exception {  
  14.         ServerSocket socket = new ServerSocket(8888);  
  15.         TServerSocket serverTransport = new TServerSocket(socket);  
  16.         LoginService.Processor processor = new Processor(new LoginServiceImpl());  
  17.           
  18.         TServer.Args tServerArgs = new TServer.Args(serverTransport);  
  19.         tServerArgs.processor(processor);  
  20.         TServer server = new TSimpleServer(tServerArgs);  
  21.         System.out.println("Starting the simple server...");  
  22.         server.serve();  
  23.     }  
  24. }  
  步骤六:运行LoginMain,控制台输出结果

Starting the simple server...

  步骤七:新建一个客户端ClientMain.java来访问服务端。代码如下:

[java] view plain copy
  1. package com.game.lll.login;  
  2.   
  3. import org.apache.thrift.protocol.TBinaryProtocol;  
  4. import org.apache.thrift.protocol.TProtocol;  
  5. import org.apache.thrift.transport.TSocket;  
  6. import org.apache.thrift.transport.TTransport;  
  7.   
  8. import com.game.lll.thrift.LoginService;  
  9. import com.game.lll.thrift.Request;  
  10.   
  11. public class ClientMain {  
  12.     public static void main(String[] args) throws Exception {  
  13.         TTransport transport = new TSocket("localhost"8888);  
  14.         TProtocol protocol = new TBinaryProtocol(transport);  
  15.   
  16.         // 创建client  
  17.         LoginService.Client client = new LoginService.Client(protocol);  
  18.   
  19.         transport.open();  // 建立连接  
  20.   
  21.         // 第一种请求类型  
  22.         Request request = new Request().setUsername("liulongling").setPassword("123456");  
  23.         System.out.println(client.doAction(request));  
  24.         transport.close();  // 请求结束,断开连接  
  25.     }  
  26. }  

  步骤八:测试结果




参考:http://www.jianshu.com/p/0f4113d6ec4b
  
原创粉丝点击