Java使用Thrift,Thrift结构体定义
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结构体定义的更多相关文章
- Swift类和结构体定义-备
Swift中的类和结构体定义的语法是非常相似的.类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: class 类名 { 定义类的成员 } struct 结构体名 { ...
- 《从零开始学Swift》学习笔记(Day 25)——类和结构体定义
原创文章,欢迎转载.转载请注明:关东升的博客 Swift中的类和结构体定义的语法是非常相似的.类使用class关键词定义类,使用struct关键词定义结构体,它们的语法格式如下: class 类名 { ...
- go 结构体定义和结构体指针
结构体一个结构体(`struct`)就是一个字段的集合. 将来要使用它向java .C# 中的class 有相同的地位 struct 可以用来值传递 同时可以通过引用传递参数(地址) java C# ...
- ARM单片机的头文件如何用结构体定义地址
下面我们以ARM Cortex-M0内核单片机LPC1114的头文件lpc11xx.h文件进行说明. 1.先说两句 lpc11xx.h文件是lpc11xx系列单片机包含的头文件.这个文件的作用和51单 ...
- C#中结构体定义并转换字节数组
最近的项目在做socket通信报文解析的时候,用到了结构体与字节数组的转换:由于客户端采用C++开发,服务端采用C#开发,所以双方必须保证各自定义结构体成员类型和长度一致才能保证报文解析的正确性,这一 ...
- C语言结构体定义的几种方法
什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...
- 将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. ...
- #pragma pack 在BITMAP结构体定义中的使用
BITMAP位图文件主要分为如下3个部分: 块名称 对应Windows结构体定义 大小(Byte) 文件信息头 BITMAPFILEHEADER 14 位图信息头 BITMAPINFOHEADER 4 ...
- 2018-3-4-dotnet-设计规范-·-结构体定义
title author date CreateTime categories dotnet 设计规范 · 结构体定义 lindexi 2018-03-04 17:48:44 +0800 2018-2 ...
随机推荐
- EUI库 - 9 - 数据集合 - 数组集合
ArrayCollection 当数组内的数据被修改了(增删改),组件能有效的获知 myCollection.addEventListener(eui.CollectionEvent.COLLE ...
- cf 760B.Frodo and pillows
二分,判断条件就是最小情况(设当前k位取x)比剩余值(m-x)要小.(貌似又做麻烦了2333) #include<bits/stdc++.h> #define LL long long # ...
- mysql行级锁和表级锁的区别
表级锁:开销小,加锁快:不会出现死锁:锁定粒度大,发生锁冲突的概率最高,并发度最低:行级锁:开销大,加锁慢:会出现死锁:锁定粒度最小,发生锁冲突的概率最低,并发度也最高:
- JS页面校验
结构: 1.导入正则表达式校验包:https://blog.csdn.net/weixin_44718300/article/details/88726653 2.页面校验.HTML <!DOC ...
- mysql第四篇:数据操作
第四篇:数据操作 一.数据操作介绍 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作 1.INSERT实现数据的插入 2.UPDATE实现数据的更新 3.DELETE实现数据的 ...
- 最短路问题-- Dijkstra Choose the best route
Choose the best route Problem Description One day , Kiki wants to visit one of her friends. As she i ...
- 【每日Scrum】第八天冲刺
一.计划会议内容 继续昨天的设计 二.任务看板 任务看板 已完成:登录与个人界面布局实现 进行中:UI设计美化,,地图主界面 待进行:功能整合,连接数据库 三.scrum讨论照片 四.产品的状态 无 ...
- 题解 P1403 【[AHOI2005]约数研究】
题目 看到题解区很多人直接给出结论:答案为 \(\displaystyle \sum_{i=1}^n\lfloor{n\over i}\rfloor\) ,没给出证明,这里给出证明 [分析] 首先,我 ...
- 01 Hello Unity
Unity接界面布局: Hierarchy(层级视图):存放当前游戏场景内所有游戏物体 Scense(主界面):主要的游戏设计界面,开发者操作界面 Game(游戏视图):玩家视角,也是摄像机所要看到的 ...
- 201771010123汪慧和《面向对象程序设计JAVA》第六周实验总结
一.理论部分: 1.继承 用已有类来构建新类的一种机制.当定义了一个新类继承了一个类时,这个新类就继承了这个类的方法和域,同时在新类中添加新的方法和域以适应新的情况. 2.类.超类.子类 (1)类继承 ...