Thrift-java实例

原文出自【听云技术博客】:http://blog.tingyun.com/web/article/detail/1082

Thrift实例1

功能描述:客户端与服务器端分别是两个应用,先启动服务器端,再启动客户端,实现执行客户端运行服务器端的加法方法。

源码截图(源码在附件中):

客户端:

TestThriftClientServlet:

SendRequestController:

Pom.xml:

服务端:

TestThriftServlet:

ThriftServerController:

IThriftServer:由thrift工具编译生成

  ThriftServerServiceImpl:

运行说明:先运行服务端TestThriftServlet,再运行客户端TestThriftClientServlet,观察控制台打印出81,即:77+5=81

Thrift实例2

1、业务逻辑描述:一个系统通过用户身份证号获取另一个系统里有关这个用户的积分。

2、首先编写脚本文件test.thrift:

命名空间:

namespace java com.test

namespace是关键字表示命名空间,也就是java的包,java表示脚本转换成java类

请求:identitycard是身份证号

struct UserRequest
{
1:string identitycard
}

返回:code是成功标识 0表示成功;integral是用户拥有的积分

Params是返回的参数集合这里只用一个字段积分(integral)做例子;

struct UserResponse
{
1:string code
2:map<string,string> params
}

服务:

service ThriftCase
{
UserResponse integralService(1: UserRequest request)
}

3、到thrift官网下载

http://thrift.apache.org/

下载:thrift-0.6.1.tar.gz和Thrift compiler for Windows (thrift-0.6.1.exe)

4、用eclips里面的ant工具把thrift-0.6.1编译出jar包

解压:thrift-0.6.1.tar.gz

把解压后的文件夹放到eclipse的某个工程下如图:

如上图thrift-0.6.1文件夹放在名字是thrift的java工程的src下,有红叉不必管他,然后进入到thrift-0.6.1/lib/java中,右键点击build.xml

如图点击Ant Build。在build.xml同路径下会产生一个build文件夹里面有生成的thrift-0.6.1.jar包。把这个包放到所做的工程的lib里就行了。

5、把thrift脚本编译成java类

把thrift-0.6.1.exe和test.thrift文件放在同一个目录下并把路径写进环境变量Path中,如:E:/soft/ccc/路径下放入上述两个文件并把路径写进环境变量Path中。

在运行中键入cmd打开dos界面,进到E:/soft/ccc/路径下,执行thrift-0.6.1.exe文件,命令如下:

E:\soft\ccc\>Thrift-0.6.1 –gen java text.thrift

在这个目录下会产生一个gen-java文件夹,文件夹中会产生相应的java类,

ThriftCase.java

UserRequest.java

UserResponse.java

将三个文件拷贝到thrift工程的src/com/test/ 路径下。

6、编写服务端代码

服务端代码包含两个类:一个是业务逻辑类,一个是socket服务类。

业务逻辑类要实现ThriftCase.Iface服务接口

package com.test;
import java.util.HashMap;
import java.util.Map;
public class ThriftCaseImpl implements ThriftCase.Iface{
public UserResponse integralService(UserRequest request)  {
try{
UserResponse urp=new UserResponse();
if(request.identitycard.equals("32010619881231103X")){
urp.setCode("0");
Map params=new HashMap();
params.put("integral", "10");
urp.setParams(params);
}
System.out.print("接收参数是:identitycard="+request.identitycard);
return urp;
}catch(Exception e){
e.printStackTrace();
}
return null;
}
}

Socket服务类

package com.test;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.protocol.TBinaryProtocol.Factory;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TThreadPoolServer;
import org.apache.thrift.server.TThreadPoolServer.Args;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
public class TestService {
private void start(){
try {
TServerSocket serverTransport = new TServerSocket(8899);
ThriftCase.Processor processor = new ThriftCase.Processor(new ThriftCaseImpl());
//TBinaryProtocol – 二进制编码格式进行数据传输。
Factory protFactory = new TBinaryProtocol.Factory(true,true);
//TCompactProtocol 这种协议非常有效的,使用Variable-Length Quantity (VLQ) 编码对数据进行压缩
//Factory protFactory = new TCompactProtocol.Factory();
Args args = new Args(serverTransport);
args.processor(processor);
args.protocolFactory(protFactory);
TServer server = new TThreadPoolServer(args);
System.out.println("Starting server on port 8899 ...");
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
TestService srv = new TestService();
srv.start();
}
}

7、客户端代码

package com.test;
import org.apache.thrift.TException;
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 org.apache.thrift.transport.TTransportException;
import com.test.ThriftCase.Client;
public class TestClient {
private void start() {
        TTransport transport;
        try {
            transport = new TSocket("localhost", 8899);
            TProtocol protocol = new TBinaryProtocol(transport);
            Client client = new Client(protocol);

            UserRequest request=new UserRequest();
            request.setIdentitycard("32010619881231103X");

            transport.open();
            com.test.UserResponse urp=client.integralService(request);
            if(urp.code!=null&&!urp.code.equals("")){
            System.out.println("返回代码:"+urp.code+"; 参数是:"+urp.params.get("integral"));
            }
            transport.close();
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        TestClient c = new TestClient();
            c.start();
    }
}

8、先开启服务

public static void main(String[] args) {
// TODO Auto-generated method stub
TestService srv = new TestService();
srv.start();
}
控制台显示:
Starting server on port 8899 ...

9、再运行客户端

public static void main(String[] args) {
        TestClient c = new TestClient();
            c.start();
    }

      控制台显示:

返回代码:0; 参数是:10

10、所需第三方包

log4j-1.2.15,

slf4j-api-1.6.1.jar

slf4j-log4j12-1.5.8.jar

时间: 2024-10-22 05:41:55

Thrift-java实例的相关文章

方法-java 实例的名称通过传递的参数来创建???

问题描述 java 实例的名称通过传递的参数来创建??? 写个方法: 方法功能是创建个类的实例,实例名称由该方法的传递参数指定 个人分析: 构造类的实例时,其实是new 构造方法 到一个变量中, 这个变量的名称需要由另一个变量(即传递参数)所指的字符串来指定 第一反应是反射,获取传递参数类的实例,失败. 暂时没想到好的方法 我的目的,期初是这么想的: static String[] toks = { "baf", "fim1", "fim", &

HTTP基本认证(Basic Authentication)的JAVA实例代码_java

大家在登录网站的时候,大部分时候是通过一个表单提交登录信息. 但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用HTTP基本认证. 下面来看看一看这个认证的工作过程: 第一步: 客户端发送http request 给服务器,服务器验证该用户是否已经登录验证过了,如果没有的话, 服务器会返回一个401 Unauthozied给客户端,并且在Response 的 header "WWW-Authenticate" 中添加信息. 如下图. 第三步: 服务器将Authorizati

JNI/NDK开发指南(七)——C/C++访问Java实例变量和静态变量

       转载请注明出处:http://blog.csdn.net/xyang81/article/details/42836783        在上一章中我们学习到了如何在本地代码中访问任意Java类中的静态方法和实例方法,本章我们也通过一个示例来学习Java中的实例变量和静态变量,在本地代码中如何来访问和修改.静态变量也称为类变量(属性),在所有实例对象中共享同一份数据,可以直接通过[类名.变量名]来访问.实例变量也称为成员变量(属性),每个实例都拥有一份实例变量数据的拷贝,它们之间修

RabbitMQ消息队列入门篇(环境配置+Java实例+基础概念)

版权声明:本文为博主原创文章,转载注明出处http://blog.csdn.net/u013142781 目录(?)[+] 一.消息队列使用场景或者其好处 消息队列一般是在项目中,将一些无需即时返回且耗时的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量. 在项目启动之初来预测将来项目会碰到什么需求,是极其困难的.消息队列在处理过程中间插入了一个隐含的.基于数据的接口层,两边的处理过程都要实现这一接口.这允许你独立的扩展或修改两边的处理过

找一些能练手的JAVA实例

问题描述 我在学习java呢,谁能提供一些java的实例吗? 解决方案 解决方案二:建议您网上找一个电梯的案例试一下,我们开始那会就是这样练习的解决方案三:tank,bbs,shopping,网上都有源码的解决方案四:你去开源网搜搜解决方案五:最好自己动手做一个,那样更能锻炼自己的能力,也可以指明以后重点学习的方向解决方案六:引用4楼senry17的回复: 最好自己动手做一个,那样更能锻炼自己的能力,也可以指明以后重点学习的方向 我不知道该做什么,刚学java,想练习一些简单的东西解决方案七:纯

Thrift Java实战

官网示例: http://thrift.apache.org/tutorial/java 软件下载: http://thrift.apache.org/download 学习教程: http://jnb.ociweb.com/jnb/jnbJun2009.html Thrift与其他传输方式的比较 xml与JSON相比体积太大,但是xml传统,也不算复杂. json体积较小,新颖,但不够完善. thrift体积超小,使用起来比较麻烦,不如前两者轻便,但是对于1.高并发.2.数据传输量大.3.多语

Flex通过RemoteObject调用java实例:flex传入参数以及接收java返回结果

Myeclipse10.0,Flash Builde4.7,jdk:1.7: 前言: Flex之前叫做Flex,后面改名字为flash了,而且在flash builder4.5的时候还可以像c#一样拉控件出来进行编程,但是到了4.7就不能拉控件了. 正文: 本篇介绍Flex调用java,分别给出flex传入参数以及接收java返回结果的例子.工程一共有两个:一个java web工程,一个flex工程.工程可以在资源页下载:http://download.csdn.net/detail/fansy

编码实现从无序链表中移除重复项(C和JAVA实例)_java

如果不能使用临时缓存,你怎么编码实现? 复制代码 代码如下: 方法一:不使用额外的存储空间,直接在原始链表上进行操作.首先用一个指针指向链表头节点开始,然后遍历其后面的节点,将与该指针所指节点数据相同的节点删除.然后将该指针后移一位,继续上述操作.直到该指针移到链表. void delete_duplicate1(node* head){    node*pPos=head->next;    node*p,*q;    while(pPos!=NULL){//用pPos指针来指示当前移动到什么

将对象转化为字符串的java实例_java

System.out.println()方法我们很熟悉,用来控制台输出,比如System.out.println("abc"),会输出字符串"abc".但是当System.out.println()传递的参数为对象会是什么情况呢?下面来看一个简单的例子: 复制代码 代码如下: package test; class A{ int a; int b; public int getA() {  return a; }  public void setA(int a) {