thrift笔记----大体上thrift知识
程序员文章站
2022-06-10 13:30:30
thrift类似java里面的socket和sockchannel中server和client通信 thrift最重要的是跨语言,里面提供了序列化和反序列化、json和实体对象等方法 Apache Thrift软件框架(用于可扩展的跨语言服务开发)将软件堆栈与代码生成引擎结合在一起,以构建可在C++ ......
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; } }
服务端启动服务
package com.test.libthrift.demo2.server; import java.util.concurrent.executorservice; import java.util.concurrent.executors; import org.apache.thrift.protocol.tbinaryprotocol; import org.apache.thrift.protocol.tcompactprotocol; import org.apache.thrift.server.tnonblockingserver; import org.apache.thrift.server.tserver; import org.apache.thrift.server.tsimpleserver; import org.apache.thrift.server.tthreadedselectorserver; import org.apache.thrift.transport.tframedtransport; import org.apache.thrift.transport.tnonblockingserversocket; import org.apache.thrift.transport.tserversocket; import org.apache.thrift.transport.ttransportexception; import com.test.libthrift.demo2.userservice; import com.test.libthrift.demo2.userserviceimpl; public class userversocket { public static void main(string[] args) throws ttransportexception { // todo auto-generated method stub /* tserversocket serversocket = new tserversocket(20000); //服务的接口 tserver.args arg = new tserver.args(serversocket); arg.processor(new userservice.processor<userservice.iface>(new userserviceimpl())); arg.protocolfactory(new tbinaryprotocol.factory()); tserver server = new tsimpleserver(arg); server.serve();*/ // 非阻塞方式 tnonblockingserversocket serversocket = new tnonblockingserversocket(20000); //服务的接口 // tnonblockingserver.args tthreadedselectorserver.args arg = new tthreadedselectorserver.args(serversocket); arg.processor(new userservice.processor<userservice.iface>(new userserviceimpl())); // 设置协议工厂,高效率的、密集的二进制编码格式进行数据传输协议 arg.protocolfactory(new tcompactprotocol.factory()); // 设置传输工厂,使用非阻塞方式,按块的大小进行传输,类似于java中的nio arg.transportfactory(new tframedtransport.factory()); // 多个线程,主要负责客户端的io处理 arg.selectorthreads(2); // 工作线程池 executorservice pool = executors.newfixedthreadpool(3); arg.executorservice(pool); tthreadedselectorserver server = new tthreadedselectorserver(arg); system.out.println("starting server ....."); server.serve(); } }
客户端连接服务端
package com.test.libthrift.demo2.client; import java.io.bytearrayoutputstream; import java.io.unsupportedencodingexception; import java.util.arraylist; import java.util.list; import org.apache.thrift.tbase; import org.apache.thrift.texception; import org.apache.thrift.tserializer; import org.apache.thrift.protocol.tbinaryprotocol; import org.apache.thrift.protocol.tcompactprotocol; import org.apache.thrift.protocol.tjsonprotocol; import org.apache.thrift.protocol.tprotocol; import org.apache.thrift.protocol.tsimplejsonprotocol; import org.apache.thrift.transport.tfastframedtransport; import org.apache.thrift.transport.tiostreamtransport; import org.apache.thrift.transport.tmemoryinputtransport; import org.apache.thrift.transport.tsocket; import org.apache.thrift.transport.ttransport; import org.apache.thrift.transport.ttransportexception; import com.test.libthrift.demo2.userinfo; import com.test.libthrift.demo2.userservice; public class usocketclient { /* public static void main(string[] args) { // todo auto-generated method stub ttransport socket = new tsocket("127.0.0.1", 20000, 30000); // 协议要和服务端一致 tprotocol protocol = new tbinaryprotocol(socket); userservice.client client = new userservice.client(protocol); try { socket.open(); } catch (ttransportexception e1) { // todo auto-generated catch block e1.printstacktrace(); } try { boolean b = client.islogin("", ""); system.out.println("收到服务端:"+b); if(b ==false){ try { thread.sleep(12000); } catch (interruptedexception e) { // todo auto-generated catch block e.printstacktrace(); } b = client.islogin("lyx", "123456"); system.out.println("收到服务端:"+b); } } catch (texception e) { // todo auto-generated catch block e.printstacktrace(); }finally { system.out.println("close"); socket.close(); } }*/ public static void main(string[] args) { // todo auto-generated method stub ttransport socket =new tfastframedtransport( new tsocket("127.0.0.1", 20000, 30000)); // 协议要和服务端一致 tprotocol protocol = new tcompactprotocol(socket); userservice.client client = new userservice.client(protocol); try { socket.open(); } catch (ttransportexception e1) { // todo auto-generated catch block e1.printstacktrace(); } try { boolean b = client.islogin("", ""); system.out.println("收到服务端:"+b); if(b ==false){ try { thread.sleep(12000); } catch (interruptedexception e) { // todo auto-generated catch block e.printstacktrace(); } b = client.islogin("lyx", "123456"); system.out.println("收到服务端:"+b); try { thread.sleep(10000); system.out.println("发送user"); 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); system.out.println("json string:"+json); system.out.println("发送str json"); client.setstr(json); system.out.println("发送usrinfo"); client.setuserinfo(user); list<userinfo> list =new arraylist<userinfo>(); for(int i=1;i<101;i++){ user = new userinfo(); user.setid(i); user.setkey("key"+i); user.setvalue("value值"+i); list.add(user); } client.setuserinfos(list); try { socket.write(json.getbytes("utf-8")); } catch (unsupportedencodingexception e) { // todo auto-generated catch block e.printstacktrace(); } system.out.println("发送user结束"); } catch (interruptedexception e) { // todo auto-generated catch block e.printstacktrace(); } } } catch (texception e) { // todo auto-generated catch block e.printstacktrace(); }finally { system.out.println("close"); socket.close(); } } }
上一篇: 运用领域模型
下一篇: 运用领域模型-绑定模型和实现