thrift类似java里面的socket和sockchannel中server和client通信
thrift最重要的是跨语言,里面提供了序列化和反序列化、json和实体对象等方法
Apache Thrift软件框架(用于可扩展的跨语言服务开发)将软件堆栈与代码生成引擎结合在一起,
以构建可在C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi
等语言
里面大概方法
图片转其他地方
数据类型
bool:布尔值,对应 Java 的 boolean byte:8 位有符号整数,对应 Java 的 byte i16:16 位有符号整数,对应 Java 的 short i32:32 位有符号整数,对应 Java 的 int i64:64 位有符号整数,对应 Java 的 long double:64 位浮点数,对应 Java 的 double string:文本或二进制字符串,对应 Java 的 String struct:定义公共的对象,在 Java 中是一个 JavaBean list:对应 Java 的 ArrayList set:对应 Java 的 HashSet map:对应 Java 的 HashMap exception:对应 Java 的 Exception service:service 类型可以被继承 enum:枚举类型
maven导入jar
<dependency> <groupId>org.apache.thrift</groupId> <artifactId>libthrift</artifactId> <version>0.13.0</version> </dependency>
新建thrift文件
(thrift命名例如UserService.thrift)
namespace java com.test.libthrift.demo2 struct UserInfo{ 1:optional i32 id; 2:optional string key; 3:optional string value; } service UserService { bool isLogin(1:string username,2:string password) UserInfo setUserInfo(1:UserInfo user) string setStr(1:string str) list<UserInfo> setuserInfos(1:list<UserInfo> li) }
生成接口
给客户端库和所编写的服务器使用,复制到服务端和客户端项目里
例如
thrift -r -gen java UserService.thrift
thrift --gen <语言> <Thrift 文件名>
序列化
TSerializer serializer = new TSerializer(new TSimpleJSONProtocol.Factory()); UserInfo user = new UserInfo(); user.setId(100); user.setKey("key01"); user.setValue("value值"); String json = serializer.toString(user);
反序列
TDeserializer deserializer = new TDeserializer(new TSimpleJSONProtocol.Factory()); UserInfo base =new UserInfo(); deserializer.deserialize(base, str,"UTF-8");
服务端实现接口
package com.test.libthrift.demo2; import java.util.List; import org.apache.thrift.TDeserializer; import org.apache.thrift.TException; import org.apache.thrift.protocol.TSimpleJSONProtocol; public class UserServiceImpl implements UserService.Iface{ @Override public boolean isLogin(String username, String password) throws TException { // TODO Auto-generated method stub System.out.println("收到客户端:"+username+"---"+password); if(username==null ||password==null) return false; if("lyx".equals(username)&&"123456".equals(password)) return true; return false; } @Override public UserInfo setUserInfo(UserInfo user) throws TException { // TODO Auto-generated method stub System.out.println("收到客户端UserInfo:"+user.toString()); return user; } @Override public String setStr(String str) throws TException { // TODO Auto-generated method stub System.out.println("收到客户端str:"+str); TDeserializer deserializer = new TDeserializer(new TSimpleJSONProtocol.Factory()); UserInfo base =new UserInfo(); deserializer.deserialize(base, str,"UTF-8"); System.out.println("反序列化:"+base.toString()); return str; } @Override public List<UserInfo> setuserInfos(List<UserInfo> li) throws TException { // TODO Auto-generated method stub System.out.println("收到客户端LIST:"); for(UserInfo u : li){ System.out.println(u.toString()); } return li; } }