1、Thrift定义文件,Thrift常见的数据类型

1.基本类型(括号内为对应的Java类型):
bool(boolean): 布尔类型(TRUE or FALSE)
byte(byte): 8位带符号整数
i16(short): 16位带符号整数
i32(int): 32位带符号整数
i64(long): 64位带符号整数
double(double): 64位浮点数
string(String): 采用UTF-8编码的字符串
2.特殊类型(括号内为对应的Java类型):
binary(ByteBuffer):未经过编码的字节流
3.Structs(结构===JAVA(对象))
4.容器 Thrift提供了3种容器类型:
List<Object>:一系列t1类型的元素组成的有序表,元素可以重复
Set<Object>:一系列t1类型的元素组成的无序表,元素唯一
Map<Object,Object>:key/value对(key的类型是t1且key唯一,value类型是t2)。
容器中的元素类型可以是除了service意外的任何合法thrift类型(包括结构体和异常)。
5.其他**
namespace 相当于java创建包 java com.thrift.membersheep.server 说明创建java 的包
service 相当于java 创建Class

2、Thrift简单结构体demo,写好了过后保存文件名后缀已.thrift结尾,如(ETH_CORE.thrift)

namespace java com.thrift.eth
//交易所_创建eth账号
struct EXCHANGE_CREATE_ETH_ACCOUNT_MODEL{
1: string path, //账号存放地址
2: string password,//密码
3: string phone_filename//账号名称
}
//交易所_返回创建eth账号信息
struct EXCHANGE_RETURN_ETH_ACCOUNT{
1: string address;//账号地址
2: string privateKey;//私钥
3: string publicKey;//公钥
4: string password;//密码
5: double coinQuantity;//货币数量
6: string message;//消息
7: i32 status;//状态
}
//交易所_转账eth
struct EXCHANGE_TRANSFER_ETH_MODEL{
1: string https_web3j,//web3j url
2: string path_file,//账号文件路径
3: string address,//账号地址
4: string password,//密码
5: string to_address,//转到那个账号地址
6: double quantity//转账数量
}
//交易所_返回转账信息
struct EXCHANGE_RETURN_TRANSFER{
1: string message;//消息
2: i32 status;//状态
}
//交易所_转账sheep
struct EXCHANGE_TRANSFER_SHEEP_MODEL{
1: string https_web3j,//web3j url
2: string path_file,//账号文件路径
3: string address,//账号地址
4: string password,//密码
5: string to_address,//转到那个账号地址
6: double quantity,//转账数量
7: string contract_address//合约地址
}
service ETH_CORE{//===========================================exhagne eth相关操作
//创建eth账号
EXCHANGE_RETURN_ETH_ACCOUNT create_eth_address(1:EXCHANGE_CREATE_ETH_ACCOUNT_MODEL create_eth_model)
//eth转账
EXCHANGE_RETURN_TRANSFER transfer_eth(1:EXCHANGE_TRANSFER_ETH_MODEL transfer_eth_model)
//获取eth余额
double get_eth_balance(1:string https_web3j,2:string address)
//sheep转账
EXCHANGE_RETURN_TRANSFER transfer_sheep(1:EXCHANGE_TRANSFER_SHEEP_MODEL transfer_sheep_model)
//获取sheep余额
double get_sheep_balance(1:string https_web3j,2:string address,3:string contract_address)
}

3、下载客服端http://thrift.apache.org/download,

4、反编译成java文件(windows版),把写好的thrift结构体放到与客服端同级

然后点击地址栏输入cmd回车运行

反编译成java命令:thrift-0.10.0 -gen java ETH_CORE.thrift 如:

回车过后文件夹下面就会自动生成java文件

然后点击去看java文件就生成好了

然后到java端使用

1、maven jar使用

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

2、先把核心包使用,就是开始创建的结构体,单独作用于一个项目,当做jar使用

3、服务器使用 pom.xml也是要引用ThriftCore项目

<dependency>
<groupId>com.lpizi</groupId>
<artifactId>ThriftCore</artifactId>
<version>1.0-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>jline</groupId>
<artifactId>jline</artifactId>
</exclusion>
</exclusions>
</dependency>

3.1、ThriftServer类

package com.thrift.server;

import com.thrift.eth.ETH_CORE;
import com.thrift.web3j.DefaultEth;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException; public class ThriftServer {public static void main(String[] args){
try {
// 设置服务器端口
TServerSocket serverTransport = new TServerSocket(端口);
// 设置二进制协议工厂
TBinaryProtocol.Factory protocolFactory = new TBinaryProtocol.Factory();
// 处理器关联业务实现
ETH_CORE.Processor<ETH_CORE.Iface> processor = new ETH_CORE.Processor<ETH_CORE.Iface>((ETH_CORE.Iface) new EthServiceImpl());
//使用单线程标准阻塞I/O模型
TServer.Args simpleArgs = new TServer.Args(serverTransport)
.processor(processor)
.protocolFactory(protocolFactory);
TServer server = new TSimpleServer(simpleArgs);
System.out.println("=====>开启thrift服务器,监听端口:"+DefaultEth.ThrifProp+"<=================");
server.serve();
} catch (TTransportException e) {
e.printStackTrace();
}
} }

3.2、EthServiceImpl类

package com.thrift.server;

import com.alibaba.fastjson.JSON;
import com.membersheep.ethereum.model.ConfirmModel;
import com.membersheep.ethereum.model.OrderDetailModel;
import com.membersheep.ethereum.model.exchange.AccountModel;
import com.membersheep.ethereum.model.exchange.TransferModel;
import com.membersheep.ethereum.web3j.TransctionContract;
import com.membersheep.ethereum.web3j.exchange.EthAccount;
import com.thrift.eth.*;
import org.apache.thrift.TException; import java.util.ArrayList;
import java.util.List; public class EthServiceImpl implements ETH_CORE.Iface {
private EthAccount ethAccount=new EthAccount();
  /*
   注意方法里面的内容是根据你自己的需求来操作,我这里是操作eth相关的 
  */
/**
* 创建ETH账号
* @param create_eth_model
* @return
* @throws TException
*/
@Override
public EXCHANGE_RETURN_ETH_ACCOUNT create_eth_address(EXCHANGE_CREATE_ETH_ACCOUNT_MODEL create_eth_model) throws TException {
EXCHANGE_RETURN_ETH_ACCOUNT returnEthAccount=new EXCHANGE_RETURN_ETH_ACCOUNT();
AccountModel accountModel=ethAccount.create(create_eth_model.path,create_eth_model.password,create_eth_model.phone_filename);
returnEthAccount.address=accountModel.address;
returnEthAccount.coinQuantity=accountModel.coinQuantity;
returnEthAccount.message=accountModel.message;
returnEthAccount.password=accountModel.password;
returnEthAccount.privateKey=accountModel.privateKey;
returnEthAccount.publicKey=accountModel.publicKey;
returnEthAccount.status=accountModel.status;
return returnEthAccount;
} /**
* eth转账
* @param transfer_eth_model
* @return
* @throws TException
*/
@Override
public EXCHANGE_RETURN_TRANSFER transfer_eth(EXCHANGE_TRANSFER_ETH_MODEL transfer_eth_model) throws TException {
EXCHANGE_RETURN_TRANSFER returnTransfer=new EXCHANGE_RETURN_TRANSFER();
TransferModel transferModel=ethAccount.transferETH(transfer_eth_model.https_web3j,transfer_eth_model.path_file,transfer_eth_model.address,transfer_eth_model.password,transfer_eth_model.to_address,transfer_eth_model.quantity);
returnTransfer.message=transferModel.message;
returnTransfer.status=transferModel.status;
return returnTransfer;
} /**
* 获取eth余额
* @param https_web3j
* @param address
* @return
* @throws TException
*/
@Override
public double get_eth_balance(String https_web3j, String address) throws TException {
return ethAccount.getETHBalance(https_web3j,address);
} /**
* sheep转账
* @param transfer_sheep_model
* @return
* @throws TException
*/
@Override
public EXCHANGE_RETURN_TRANSFER transfer_sheep(EXCHANGE_TRANSFER_SHEEP_MODEL transfer_sheep_model) throws TException {
EXCHANGE_RETURN_TRANSFER returnTransfer=new EXCHANGE_RETURN_TRANSFER();
TransferModel transferModel=ethAccount.transferSHEEP(transfer_sheep_model.https_web3j,transfer_sheep_model.path_file,
transfer_sheep_model.address,transfer_sheep_model.password,transfer_sheep_model.to_address,
transfer_sheep_model.quantity,transfer_sheep_model.contract_address);
returnTransfer.message=transferModel.message;
returnTransfer.status=transferModel.status;
return returnTransfer;
} /**
* 获取sheep余额
* @param https_web3j
* @param address
* @param contract_address
* @return
* @throws TException
*/
@Override
public double get_sheep_balance(String https_web3j, String address, String contract_address) throws TException {
return ethAccount.getSHEEPBalance(https_web3j,address,contract_address);
}
}

end 这上面服务端就好了

4、客户端使用pom.xml也是要引用ThriftCore项目(同服务端调用)如下这个两个类就OK了

4.1、GetServer类

package com.membersheep.util.thrift;

import com.membersheep.util.proper.DefaultProp;
import com.thrift.eth.ETH_CORE;
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; public class GetServer {
/**
* 获取通讯链接
* @return
*/
public TTransport get_transport(){
// 设置调用的服务地址-端口
return new TSocket(服务端URL, 服务端端口);
} /**
* 打开通道
* @return
* @throws TTransportException
*/
public ETH_CORE.Client open_client(TTransport transport) throws TTransportException {
// 使用二进制协议
TProtocol protocol = new TBinaryProtocol(transport);
// 使用的接口
ETH_CORE.Client client = new ETH_CORE.Client(protocol);
// 打开socket
transport.open();
return client;
}
}

4.2、ThriftExchangeEthClient类,还是那句话方法里面的东西根据自己的需求定义

package com.membersheep.util.thrift;

import com.thrift.eth.*;
import org.apache.thrift.TException;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.TTransportException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class ThriftExchangeEthClient {
private static Logger logger= LoggerFactory.getLogger(ThriftExchangeEthClient.class); /**
* 创建eth账号
* @param create_eth_account_model
* @return
*/
public EXCHANGE_RETURN_ETH_ACCOUNT create_eth_address(EXCHANGE_CREATE_ETH_ACCOUNT_MODEL create_eth_account_model){
EXCHANGE_RETURN_ETH_ACCOUNT returnEthAccount=new EXCHANGE_RETURN_ETH_ACCOUNT();
GetServer getServer=new GetServer();
TTransport transport=getServer.get_transport();
try {
ETH_CORE.Client client = getServer.open_client(transport);
returnEthAccount=client.create_eth_address(create_eth_account_model);
} catch (TTransportException e) {
logger.error("create_eth_address==>TTransportException====>"+e.getMessage());
} catch (TException e) {
logger.error("create_eth_address==>TException====>"+e.getMessage());
}finally {
transport.close();
}
return returnEthAccount;
} /**
* eth转账
* @param transfer_eth_model
* @return
*/
public EXCHANGE_RETURN_TRANSFER transfer_eth(EXCHANGE_TRANSFER_ETH_MODEL transfer_eth_model){
EXCHANGE_RETURN_TRANSFER returnTransfer=new EXCHANGE_RETURN_TRANSFER();
GetServer getServer=new GetServer();
TTransport transport=getServer.get_transport();
try {
ETH_CORE.Client client = getServer.open_client(transport);
returnTransfer=client.transfer_eth(transfer_eth_model);
} catch (TTransportException e) {
logger.error("transfer_eth==>TTransportException====>"+e.getMessage());
} catch (TException e) {
logger.error("transfer_eth==>TException====>"+e.getMessage());
}finally {
transport.close();
}
return returnTransfer;
} /**
* 获取eth余额
* @param https_web3j
* @param address
* @return
*/
public double get_eth_balance(String https_web3j,String address){
GetServer getServer=new GetServer();
TTransport transport=getServer.get_transport();
double balance=0;
try {
ETH_CORE.Client client = getServer.open_client(transport);
balance=client.get_eth_balance(https_web3j,address);
} catch (TTransportException e) {
logger.error("get_eth_balance==>TTransportException====>"+e.getMessage());
} catch (TException e) {
logger.error("get_eth_balance==>TException====>"+e.getMessage());
}finally {
transport.close();
}
return balance;
} /**
* 转账sheep
* @param transfer_sheep_model
* @return
*/
public EXCHANGE_RETURN_TRANSFER transfer_sheep(EXCHANGE_TRANSFER_SHEEP_MODEL transfer_sheep_model){
EXCHANGE_RETURN_TRANSFER returnTransfer=new EXCHANGE_RETURN_TRANSFER();
GetServer getServer=new GetServer();
TTransport transport=getServer.get_transport();
try {
ETH_CORE.Client client = getServer.open_client(transport);
returnTransfer=client.transfer_sheep(transfer_sheep_model);
} catch (TTransportException e) {
logger.error("transfer_sheep==>TTransportException====>"+e.getMessage());
} catch (TException e) {
logger.error("transfer_sheep==>TException====>"+e.getMessage());
}finally {
transport.close();
}
return returnTransfer;
} /**
* 获取sheep余额
* @param https_web3j
* @param address
* @param contract_address
* @return
*/
public double get_sheep_balance(String https_web3j,String address,String contract_address){
GetServer getServer=new GetServer();
TTransport transport=getServer.get_transport();
double balance=0;
try {
ETH_CORE.Client client = getServer.open_client(transport);
balance=client.get_sheep_balance(https_web3j,address,contract_address);
} catch (TTransportException e) {
logger.error("get_sheep_balance==>TTransportException====>"+e.getMessage());
} catch (TException e) {
logger.error("get_sheep_balance==>TException====>"+e.getMessage());
}finally {
transport.close();
}
return balance;
}
}

这几OJBK了

Java使用Thrift,Thrift结构体定义的更多相关文章

  1. Swift类和结构体定义-备

    Swift中的类和结构体定义的语法是非常相似的.类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: class 类名 { 定义类的成员 } struct 结构体名 { ...

  2. 《从零开始学Swift》学习笔记(Day 25)——类和结构体定义

    原创文章,欢迎转载.转载请注明:关东升的博客 Swift中的类和结构体定义的语法是非常相似的.类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: class 类名 { ...

  3. go 结构体定义和结构体指针

    结构体一个结构体(`struct`)就是一个字段的集合. 将来要使用它向java .C# 中的class 有相同的地位 struct 可以用来值传递 同时可以通过引用传递参数(地址) java C# ...

  4. ARM单片机的头文件如何用结构体定义地址

    下面我们以ARM Cortex-M0内核单片机LPC1114的头文件lpc11xx.h文件进行说明. 1.先说两句 lpc11xx.h文件是lpc11xx系列单片机包含的头文件.这个文件的作用和51单 ...

  5. C#中结构体定义并转换字节数组

    最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换:由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一 ...

  6. C语言结构体定义的几种方法

    什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...

  7. 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct

    https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...

  8. #pragma pack 在BITMAP结构体定义中的使用

    BITMAP位图文件主要分为如下3个部分: 块名称 对应Windows结构体定义 大小(Byte) 文件信息头 BITMAPFILEHEADER 14 位图信息头 BITMAPINFOHEADER 4 ...

  9. 2018-3-4-dotnet-设计规范-·-结构体定义

    title author date CreateTime categories dotnet 设计规范 · 结构体定义 lindexi 2018-03-04 17:48:44 +0800 2018-2 ...

随机推荐

  1. 安装与配置windbg的symbol(符号)

    http://msdn.microsoft.com/en-us/windows/hardware/gg463028.aspx  windows symbols下载地址 本篇是新手自己写的一点心得.建议 ...

  2. VS 2017 没有工具栏中没有Report Viewer的解决方案

    安装 控件 Install-Package Microsoft.ReportingServices.ReportViewerControl.WinForms -Pre “工具”>“Nuget包管 ...

  3. Java UDP发送与接收

    IP地址?端口号?主机名? 什么是Socket? 什么是UDP? 什么是TCP? UDP和TCP区别? 以上问题请自行百度,有标准解释,此处不再赘述,直接上干货! 实例: 发送端: public cl ...

  4. Android进阶——Android消息机制之Looper、Handler、MessageQueen

    Android消息机制可以说是我们Android工程师面试题中的必考题,弄懂它的原理是我们避不开的任务,所以长痛不如短痛,花点时间干掉他,废话不多说,开车啦 在安卓开发中,常常会遇到获取数据后更新UI ...

  5. VLOOKUP返回#N/A结果

    VLOOKUP返回#N/A结果 1.无目标值 使用control+f查找是否存在所要搜索的值. 2.位置错误 所要搜索区域,被搜索值必须在首列. 3.格式错误 搜索值和被搜索区域格式需一致. 4.特殊 ...

  6. Ubuntu下caffe:用自己的图片训练并测试AlexNet模型

    参考博客:https://blog.csdn.net/eereere/article/details/79118645#commentBox 目录 1.准备图片 2. 将 图片路径写入txt 参考 这 ...

  7. 抓DHCP客户端ip脚本

    cat testnew.sh #!/bin/bash catch_ip (){Ip=`sudo nmap -sP 192.168.1.0/24 |grep -i -B2 $mac|grep Nmap ...

  8. 【收藏】免费开源好看的bootstrap后台模板

    1.ace admin github:https://github.com/bopoda/acedemo:http://ace.jeka.by/ 2.CoreUI jQuery.Angular.Rea ...

  9. C++多态性与虚函数

    派生一个类的原因并非总是为了继承或是添加新的成员,有时是为了重新定义基类的成员,使得基类成员“获得新生”.面向对象的程序设计真正的力量不仅仅是继承,而且还在于允许派生类对象像基类对象一样处理,其核心机 ...

  10. 三分钟入坑指北 🔜 Docsify + Serverless Framework 快速创建个人博客系统

    之前由于学摄影的关系,为了提高自己的审美,顺便锻炼下自己的英文能力,翻译了不少国外艺术类的 文章.最近一直想搭一个个人博客来存放这些内容,又懒得折腾建站,遂一直搁置. 直到偶然发现了 docsify ...