Thrift 基础教程(二)编码篇

来源:互联网 发布:淘宝助理要收费 吗 编辑:程序博客网 时间:2024/06/16 10:18
上接Thrift 基础教程(一)安装篇,今天来介绍下Thrift的编码过程,首先通过命令行生成框架代码。
命令格式如下:
thrift —gen language xxx.thrift

1、首先介绍下那个xxx.thrift文件,我们需要先创建myserver.thrift文件,这个接口主要定义服务接口和数据格式。
介绍一下thrift文件的语法格式,以我写的myserver.thrift说明。
/***  thrift中的数据类型*  bool        布尔类型*  byte        同java里的byte*  i16         短整型,同short int*  i32         整型,同int*  i64         长整型,同long *  double      64位浮点数*  string      同java的string*  binary      字节数组*  map<t1,t2>  同java的hashmap泛型*  list<t1>    同java的arraylist,存储的数据是已排序的*  set<t1>     同java的hashset,存储不重覆的数据*//**这里定义各语言的namespace*/namespace java com.lzf.thrift.demo1namespace php Demo/***定义服务,格式为 service 服务名{},这里也可以继承其它的thrift文件里的service,格式如下* service 服务名 extends aaa.aaaservice{},需要在当前文件头部加上* include "aaa.thrift"* 这里定义一个简单的服务*//**可以定义结构体,用于交换对象等数据*/struct User{    1:string name,    2:i32 age}service HelloServe{    /*    *在服务里面可以定义方法    *格式:返回值 方法名(参数位置:参数类型 参数名)    */    i32 adduser(1:i32 age,2:string name),    map<string,i32> getusers()}

服务端
2、生成服务端java代码
thrift --gen java myserver.thrift  生成java代码。
为了方便测试和编译,我使用了idea创建了一个项目,正常流程一般使用ant或maven
创建完成后,把thrift-0.9.0/lib/java/build/libthrift-0.9.0.jar,thrift-0.9.0/lib/java/build/lib/*.jar拷备到你的工程里,并且要导入。

3、实现方法
我们在配置文件中定义了adduser和getusers两个方法,thrift帮我们生成了HelloServe.java,这里面有个接口,所以我们新建一个DemoHandler类,实现HelloServe.java里的Iface,代码如下:
package com.lzf.thrift.demo1;import org.apache.thrift.TException;import java.util.HashMap;public class DemoHandler implements HelloServe.Iface{    public DemoHandler(){}    private static HashMap<String,Integer> users = new HashMap<>();    public int adduser(int age, String name) throws TException{        users.put(name,age);        return 1001;    }    public HashMap<String,Integer> getusers(){        return users;    }}

新建DemoServer类,主要用于建立服务,代码如下:
package com.lzf.thrift.demo1;import org.apache.thrift.server.TServer;import org.apache.thrift.server.TServer.Args;import org.apache.thrift.server.TSimpleServer;import org.apache.thrift.server.TThreadPoolServer;import org.apache.thrift.transport.TSSLTransportFactory;import org.apache.thrift.transport.TServerSocket;import org.apache.thrift.transport.TServerTransport;import org.apache.thrift.transport.TSSLTransportFactory.TSSLTransportParameters;import java.lang.Exception;import java.lang.Override;import java.lang.Runnable;public class DemoServer{    public static DemoHandler handler;    public static HelloServe.Processor processor;    public static void main(String[] args){        try{            handler = new DemoHandler();            processor = new HelloServe.Processor(handler);            simple(processor);        }catch (Exception x){            x.printStackTrace();        }    }    public static void simple(HelloServe.Processor processor) {        try {            TServerTransport serverTransport = new TServerSocket(9090);            TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));            System.out.println("Starting the simple server...");            server.serve();        } catch (Exception e) {            e.printStackTrace();        }    }}
服务端代码编写完成。

客户端
1、生成php客户端代码
thrift --gen php myserver.thrift生成php框架代码,创建一个新项目把gen-php拷备到项目中,并把thrift-0.9.0/lib/php/lib/Thrift复制到你的项目中去,这是基础库。

2、创建客户端
在项目根目录新建index.php,代码如下:
<?php/** * author: lzf * createTime: 15/8/3 22:13 * description: */require_once 'Thrift/ClassLoader/ThriftClassLoader.php';use Thrift\ClassLoader\ThriftClassLoader;$GEN_DIR = realpath(dirname(__FILE__)).'/gen-php';$loader = new ThriftClassLoader();$loader->registerNamespace('Thrift', __DIR__);$loader->registerDefinition('Demo', $GEN_DIR);$loader->register();use Thrift\Protocol\TBinaryProtocol;use Thrift\Transport\TSocket;use Thrift\Transport\THttpClient;use Thrift\Transport\TBufferedTransport;use Thrift\Exception\TException;try {    $socket = new TSocket('localhost', 9090);    $transport = new TBufferedTransport($socket, 1024, 1024);    $protocol = new TBinaryProtocol($transport);    $client = new \Demo\HelloServeClient($protocol);    $transport->open();    echo $client->adduser(23,"lzf");    echo $client->adduser(23,"lzf001");    echo $client->adduser(23,"lzf002");    echo '执行了<br />';    $userlist = $client->getusers();    print_r($userlist);    $transport->close();} catch (TException $tx) {    print 'TException: '.$tx->getMessage()."\n";}

3、测试
运行Java服务端代码,从IDE里直接运行


然后访问index.php,结果如下 

至此,Thrift基础教程介绍完了,如有问题欢迎批评指证:)微笑

1 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 通宵失眠第二天怎么办 考试前睡不着觉怎么办 一到晚上睡不着怎么办 明天考试听力差怎么办 天天晚上睡不着觉怎么办 因紧张睡不着觉怎么办 房卡找不到了怎么办 马代不会英文怎么办 剩下的蒸米饭怎么办 临时牌照违法了怎么办 打12345不管用怎么办 省政府改变了中央文件怎么办 应聘时学历不够怎么办 做导游学历不够怎么办 市长热线打不通怎么办 12315网站不受理怎么办 法律文书生效前转后财产怎么办 打12345投诉没用怎么办 单位医保停了怎么办 iphonex开不了机怎么办 会计证三年没检怎么办 银行工作人员态度不好怎么办 生殖保健服务证怎么办 关机后自动开机怎么办 大连卖房户口怎么办 在警务室被辅警骂了怎么办 上海微信怎么办居住证 公共自行车卡消磁怎么办 港澳通行证到期了怎么办 徐海路大桥对面怎么办 没有买公务机票怎么办 电脑黑屏怎么办重启也没有用 航空公司原因航班取消怎么办 政府采购2次废标怎么办 车卖给别人车牌怎么办 医用耗材中标后怎么办 国六标准国五车怎么办 年审标志丢了怎么办 大专不过统招线怎么办 雅安停天然气了怎么办 调档函过期了怎么办