风之翊 2019-12-29
一、下载 thrift-0.10.0.exe
下载地址:https://www.apache.org/dist/thrift/
二、编写接口
1.基本类型
bool: 布尔类型,占一个字节
byte: 有符号字节
i16:16位有符号整型
i32:32位有符号整型
i64:64位有符号整型
double:64位浮点数
string:字符串
2.容器类型(和Java中的差不多)
List<A>:一系列A类型的元素组成的有序列表,元素可以重复
Set<B>:一些t1类型的元素组成的无序集合,元素唯一不重复
Map<A,B>:键值对对,key唯一
3.结构体
thrift中使用struct 来声明一个结构体,这等同与面向对象语言中的类定义。
struct User{ //声明一个类(在java中称为类) 1:string userName, 2:string userPwd, }
4.异常
异常使用关键字exception来声明
5.服务
使用service关键字来声明
service LoginManger{ bool loginCheck(1:User user), //这里可以对上面声明的类进行使用了 bool register(1:User user), }
6.类型定义
typedef double mydouble typedef i32 myi32
7.名字空间
使用namespace声明,在Java中产生相应的包
编写一个login service ,将文件命名为Test.thrift
namespace java com.javabull.u.remote.conmunication.entities //声明在java下的包,当然你可以按照你自己的意愿写 struct User{ //声明一个类(在java中称为类) 1:string userName, 2:string userPwd, } service LoginManger{ bool loginCheck(1:User user), //这里可以对上面声明的类进行使用了 bool register(1:User user), }
使用thrift-0.10.0.exe -gen java Test.thrift生成Java代码
在这里,命令行报错,是由于参数要定义顺序,所以加上顺序就可以了
最后生成的Java代码
三、服务器端的接口的实现
类实现LoginManger.Iface即可。
服务端使用maven引入thrift <dependencies> <!-- 引入thrift依赖--> <dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.10.0</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>1.7.5</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.5</version> </dependency> </dependencies>
四、服务器端的使用 编写Servlet,继承自TServlet
import org.apache.thrift.protocol.TBinaryProtocol; import org.apache.thrift.server.TServlet; import com.javabull.u.remote.conmunication.LoginManager; import com.javabull.u.remote.conmunication.LoginManagerImpl; public class RemoteServlet extends TServlet{ private static final long serialVersionUID = 1L; public RemoteServlet() {//LoginManagerImpl是对LoginManger.Iface的实现 12 super(new LoginManager.Processor<>(new LoginManagerImpl()), new TBinaryProtocol.Factory()); } }
五、Android端的引用
//引入thrift依赖 implementation ‘org.apache.thrift:libthrift:0.12.0‘ implementation ‘org.glassfish.main:javax.annotation:4.0-b33‘
发现报错,在build.gradle加入packagingOptions即可
android { compileSdkVersion 29 buildToolsVersion "29.0.2" defaultConfig { applicationId "com.javabull.android_thrift" minSdkVersion 15 targetSdkVersion 29 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile(‘proguard-android-optimize.txt‘), ‘proguard-rules.pro‘ } } //加入packagingOptions即可 packagingOptions { exclude ‘META-INF/DEPENDENCIES‘ exclude ‘META-INF/NOTICE‘ exclude ‘META-INF/LICENSE‘ exclude ‘META-INF/LICENSE.txt‘ exclude ‘META-INF/NOTICE.txt‘ } }
THttpClient httpClient = new THttpClient("http://localhost:8080/server.do"); //访问Tomcat中Servlet TProtocol protocol = new TBinaryProtocol(httpClient); LoginManager.Client client = new InterManager.Client(protocol); //之后可以通过client调用之前编写好的接口
ok,大功告成