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 ...
随机推荐
- vue项目配置多入口多出口【转载】
版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/localhost_1314/article ...
- IDEA创建新文件时自动生成时间和作者
打开设置,打开下图的选项并且输入 /** * @author 你的名字 * @date ${DATE} ${TIME} */
- 阿里P7Java最全面试296题:阿里天猫、蚂蚁金服含答案文档解析
[阿里天猫.蚂蚁.钉钉面试专题题目加答案] 不会做别着急:文末有答案以及视频讲解,架构师资料 1. junit用法,before,beforeClass,after, afterClass的执行顺序 ...
- SpringCloud学习之大纲总略(大纲篇)
微服务架构的概念,现在对于大家应该都不陌生,无论使用 Apache Dubbo.还是 Spring Cloud,都可以去尝试微服务,把复杂而庞大的业务系统拆分成一些更小粒度且独立部署的 Rest 服务 ...
- Centos下nginx安装
安装很简单,这里记录只是为了记下下载地址: A.[root@localhost soft]# wget http://nginx.org/download/nginx-1.4.2.tar.gz B.[ ...
- 第一个eclipse maven项目!我超全!
前言:以前一直用idea做东西,今天突然想试一下,没想到配置起来是真的麻烦!!!!会出现各种各样的问题,太晚了,本文只做出几处非常严重的问题,如有疑问,请私信,留言 准备:本文 JDK 1.8 ...
- CSU_1414 Query On a Tree BFS序+DFS时间戳进行预处理
2014 csu校赛 I 题,比赛的时候拿着他看了几个小时愣是没弄出好的方法,我们也想过统计出每个root的节点总数,然后减去离它d层的子节点的数目,即为答案.但是因为树的存储是无序的,所以每次为了找 ...
- Vmware 主机锁定模式
https://docs.vmware.com/cn/VMware-vSphere/6.5/com.vmware.vsphere.security.doc/GUID-88B24613-E8F9-40D ...
- Vmware 困惑点记录和解释
个人理解,如果有不同见解,麻烦请留言,一起进行探讨: DRS和HA是两个独立的功能. 准入控制只是保障有资源打开故障后迁移来的虚拟机,就算自身已经超过切换的阈值了,HA也是可以迁移过去的. 虚拟机允许 ...
- docker安装fastdfs与java客户端测试
一.docker 安装FastDFS 1.拉取镜像 docker pull morunchang/fastdfs 2.创建并启动tracker容器 docker run -d --name=track ...