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. 三十一、CI框架之使用验证码

    一.CI的验证码功能用着很是舒服,需要在根目录下新建一个captcha的验证码文件夹用于存放生产的图片,代码如下: 二.浏览器效果如下: 总结:关于验证码生产函数,有很多参数可以设置,包括字体,验证码 ...

  2. IIS7实现访问HTTP定向至HTTPS访问

    工具及软件: 系统:windows2008R2 软件:IIS7.0,IIS的Microsoft URL重写模块2.0 下载 操作步骤: 1.下载并在IIS中安装Microsoft URL重写模块2.0 ...

  3. 开发app

    开始学习apicloud开发流程 第一天 了解平台应用 第二天看视频进行学习软件开发的过程 第三天学习编码html 第四天编写了一副框架 第五天完成扫一i扫

  4. Multiarmed Bandit Algorithm在股票中的应用

    股票与Bandit Machine看起来相去甚远,但实际上通过限制买入和卖出的行为,股票可以转换为Bandit Machine,比如:规定股票必须在买入一天以后卖出.为什么要大费周折地把股票变成Ban ...

  5. GWCTF 2019]我有一个数据库

    0x00 知识点 phpMyadmin(CVE-2018-12613)后台任意文件包含漏洞 影响版本:4.8.0--4.8.1 payload:/phpmyadmin/?target=db_datad ...

  6. APP分享视频H5页面

    男左女右中国APP需要做一个APP分享视频H5页面,效果图见下面的图. 出现的问题: (1)URL参数为中文的时候乱码: (2)vedio点击默认是QQ,微信的播放器: (3)给视频添加一个默认的封面 ...

  7. Tensorflow学习教程------tensorboard网络运行和可视化

    tensorboard可以将训练过程中的一些参数可视化,比如我们最关注的loss值和accuracy值,简单来说就是把这些值的变化记录在日志里,然后将日志里的这些数据可视化. 首先运行训练代码 #co ...

  8. 编写检测深度模型测试程序python

    参考:https://blog.csdn.net/haoji007/article/details/81035565?utm_source=blogxgwz9 首先从网上下载imagenet训练好的模 ...

  9. Vue动态添加v-model绑定及获取其返回数据

    从数据库拿到的动态数据绑定到页面对应的v-model或者v-bind上,并且根据对页的操作获取到返回的值: 1.首先在data里定义一个数据 timeTip 为一个空数组 data () { retu ...

  10. ZOJ 3765 Lights (zju March I)伸展树Splay

    ZJU 三月月赛题,当时见这个题目没辙,没学过splay,敲了个链表TLE了,所以回来好好学了下Splay,这道题目是伸展树的第二题,对于伸展树的各项操作有了更多的理解,这题不同于上一题的用指针表示整 ...