当前位置: 移动技术网 > IT编程>软件设计>领域驱动 > thrift笔记----大体上thrift知识

thrift笔记----大体上thrift知识

2020年04月12日  | 移动技术网IT编程  | 我要评论

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();
        }
        
        
    }
    

}

 

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网