`

Thrift 序列化示例

 
阅读更多

 

IDL如下:

 

namespace java com.app.thrift.test
service Hello{
    UserMessage tell(1:UserMessage message)
}

struct UserMessage{
    1:i32 userId;
    2:string username;
    3:string message
}

 

 

使用thrift-0.10.0.exe 生成相关的java类:

 

 thrift-0.10.0.exe -gen java Hello.thrift

 

 

测试客户端代码:

 

 

 TTransport transport = null;
        try {
            transport = new TSocket(SERVER_IP, SERVER_PORT, TIMEOUT);
            TProtocol protocol = new TBinaryProtocol(transport);
            com.app.thrift.test.hello.Hello.Client client = new Hello.Client(protocol);
            UserMessage message = new UserMessage();
            message.setMessage(" are you come from sy?");
            message.setUserId(1002);
            message.setUsername("user1");

            transport.open();
            UserMessage backMessage =  client.tell(message);
            System.out.println("Thrify client result : " );
            System.out.println("from " + backMessage.getUsername() + "(" + backMessage.getUserId() + "):" + backMessage.getMessage());
        } catch (TTransportException e) {
            e.printStackTrace();
        } catch (TException e) {
            e.printStackTrace();
        } finally {
            if (null != transport) {
                transport.close();
            }
        }

 

 

服务端代码只是截取报文:

  

 try {
            ServerSocket serverSocket = new ServerSocket(SERVER_PORT);
            Socket socket = serverSocket.accept();
            InputStream is = socket.getInputStream();
            byte [] data = new byte[1024];
            int length = is.read(data);
            FileOutputStream fos = new FileOutputStream(new File("c:\\test.log"));
            while(length>0){
                fos.write(data,0,length);
                length = is.read(data);
            }
            fos.close();
            System.out.println("readFinish");
        }catch (Exception e){
            e.printStackTrace();
        }

 

 

 

数据由TProtocol写入。

TProtocol--协议层(按照协议规定的格式)--》写入--》TTransport--(代表了与另一端服务连接的通道,可如Socket)

(TProtocol 需要内部持有TTransport)

  TProtocol 代码如下:

public abstract class TProtocol {

  /**
   * Transport
   */
  protected TTransport trans_;
  
  /**
   * Writing methods.
   */
 public abstract void writeMessageBegin(TMessage message) throws TException;

  public abstract void writeMessageEnd() throws TException;

  public abstract void writeStructBegin(TStruct struct) throws TException;

  public abstract void writeStructEnd() throws TException;

  public abstract void writeFieldBegin(TField field) throws TException;

  public abstract void writeFieldEnd() throws TException;

  public abstract void writeFieldStop() throws TException;

  public abstract void writeMapBegin(TMap map) throws TException;

  public abstract void writeMapEnd() throws TException;

  public abstract void writeListBegin(TList list) throws TException;

  public abstract void writeListEnd() throws TException;

  public abstract void writeSetBegin(TSet set) throws TException;

  public abstract void writeSetEnd() throws TException;

  public abstract void writeBool(boolean b) throws TException;

  public abstract void writeByte(byte b) throws TException;

  public abstract void writeI16(short i16) throws TException;

  public abstract void writeI32(int i32) throws TException;

  public abstract void writeI64(long i64) throws TException;

  public abstract void writeDouble(double dub) throws TException;

  public abstract void writeString(String str) throws TException;

  public abstract void writeBinary(ByteBuffer buf) throws TException;

  /**
   * Reading methods.
   */

  public abstract TMessage readMessageBegin() throws TException;

  public abstract void readMessageEnd() throws TException;

  public abstract TStruct readStructBegin() throws TException;

  public abstract void readStructEnd() throws TException;

  public abstract TField readFieldBegin() throws TException;

  public abstract void readFieldEnd() throws TException;

  public abstract TMap readMapBegin() throws TException;

  public abstract void readMapEnd() throws TException;

  public abstract TList readListBegin() throws TException;

  public abstract void readListEnd() throws TException;

  public abstract TSet readSetBegin() throws TException;

  public abstract void readSetEnd() throws TException;

  public abstract boolean readBool() throws TException;

  public abstract byte readByte() throws TException;

  public abstract short readI16() throws TException;

  public abstract int readI32() throws TException;

  public abstract long readI64() throws TException;

  public abstract double readDouble() throws TException;

  public abstract String readString() throws TException;

  public abstract ByteBuffer readBinary() throws TException;

  }

 

 

得到报文(c:\\test.log),用二进制方式查看:



 解释一下上图中的传输报文内容:(由TBinaryProtocol写入)

 

1.80 01  00 01

    协议版本号   80 01  00 00 (或操作)  消息类型  01 call    

    消息类型为:01 对应 call--调用

    其它消息类型为:

   

public final class TMessageType {
  public static final byte CALL  = 1;
  public static final byte REPLY = 2;
  public static final byte EXCEPTION = 3;
  public static final byte ONEWAY = 4;
}

 

 

2.  00 00 00 04

   方法名称长度,int型:4个bit ,值=4,即之后的4个字节为方法名称

3.74 65 6c 6c

方法名称内容: 长度由2决度 ,内容为tell

4. 00 00 00 01

  方法顺序号,值1 =第一个(只有一个) 

 

以上对应TBinaryProtocol方法:

   

public void writeMessageBegin(TMessage message) throws TException {
    if (strictWrite_) {
      int version = VERSION_1 | message.type;
      writeI32(version);//这个写入协议版本号
      writeString(message.name);//这个写入方法名称长度及内容
      writeI32(message.seqid);//这个写入序列号
    } else {
      writeString(message.name);
      writeByte(message.type);
      writeI32(message.seqid);
    }
  }

 

之后的字节描述参数:

5. 0c 00 01

   第一个字节代表 类型 0C=struct 

   后两个字节代表 序号 00 01 :第一个struct 

  

  public void writeFieldBegin(TField field) throws TException {
    writeByte(field.type);//1个字节的类型
    writeI16(field.id);//2个字节的顺序号
  }

 6. 08 00 01 

     第一个字节代表 类型 08= i32 整型

    后两个字节代表 序号 00 01 :struct 中第一个元素

   

  public void writeFieldBegin(TField field) throws TException {
    writeByte(field.type);//1个字节的元素类型
    writeI16(field.id);//2个字节的元素顺序号
  }
 7.00 00 03 ea

 

    上面指定了元素类型为 i32,即元素内容占用4个节,这是I32类型元素内容,值十进制==1002

    

  public void writeI32(int i32) throws TException {
    inoutTemp[0] = (byte)(0xff & (i32 >> 24));
    inoutTemp[1] = (byte)(0xff & (i32 >> 16));
    inoutTemp[2] = (byte)(0xff & (i32 >> 8));
    inoutTemp[3] = (byte)(0xff & (i32));
    trans_.write(inoutTemp, 0, 4);
  }

 

8.0b 00 02

    第一个字节代表类型 0b=string 类型

    第二个字节代表顺序号 00 02 == struct 中第二个元素

   

  public void writeFieldBegin(TField field) throws TException {
    writeByte(field.type);
    writeI16(field.id);
  }

 

9.00 00 00 05 

   上面指定了第二个元素是string ,此处指定了string的长度是5,即之后的5个字节是第二个元素的内容

   

 10.75 73 65 72 31

  第二个元素的内容:user1

 

 9与10 代码:

   

  public void writeString(String str) throws TException {
    try {
      byte[] dat = str.getBytes("UTF-8");
      writeI32(dat.length);
      trans_.write(dat, 0, dat.length);
    } catch (UnsupportedEncodingException uex) {
      throw new TException("JVM DOES NOT SUPPORT UTF-8");
    }
  }

 

.......其它字节与上面类似,不再解释。

 

 

   

  

 

  • 大小: 45.9 KB
分享到:
评论

相关推荐

    C++(Qt)下的thrift的使用示例

    在C++中,Thrift生成的代码通常包含了服务的抽象接口、数据结构的类以及必要的序列化和反序列化逻辑。在Qt项目中,我们可以创建一个Thrift服务,然后在客户端和服务器端之间传递消息。 为了使用Thrift,你需要下载...

    Java中使用Thrift实现RPC示例代码.rar

    Thrift是Facebook开源的一个跨语言的服务开发框架,它结合了序列化、网络通信和RPC协议,为开发者提供了一种高效、轻量级的方式来构建分布式系统。本示例主要探讨如何在Java环境中使用Thrift实现RPC。 首先,我们...

    序列化与反序列化Demo

    以下是一个简单的序列化示例: ```java try (FileOutputStream fos = new FileOutputStream("serializedObj.ser"); ObjectOutputStream oos = new ObjectOutputStream(fos)) { oos.writeObject(new ...

    Java序列化

    - 提供的PPT可能包含了序列化的基本概念、如何实现序列化、注意事项以及示例等内容。源码演示则可能包括具体的序列化和反序列化操作,帮助理解实践过程。 通过以上知识点的学习,你可以对Java序列化有深入的理解,...

    thrift实现http协议案例

    在这个Servlet中,我们读取HTTP请求的主体(通常是Thrift序列化的数据),然后通过处理器`processor`来处理这个请求。处理完成后,我们将Thrift的响应写回HTTP响应。 这个案例中的“MyThriftWebTest”可能是一个...

    Thrift 示例代码_Java

    此外,Thrift 支持多种传输方式(如 HTTP、TCP)和序列化协议(如 Binary、JSON),为开发者提供了极大的灵活性。 总之,Thrift 示例代码 Java 版本提供了一个直观的学习平台,帮助开发者了解如何使用 Thrift 构建...

    Netty中的java序列化

    Netty是一个高性能、异步事件驱动的网络应用...在提供的`NettyTest`压缩包中,可能包含了实现这一过程的示例代码,通过运行`SubReqServer`和`SubReqClient`的Main函数,可以直观地了解和学习Netty中的Java序列化应用。

    ThriftTest

    二、Thrift序列化与反序列化 1. 序列化:Thrift提供了一种高效的二进制序列化方式,将对象转换成字节流,便于在网络间传输。序列化过程包括解析数据结构,生成字节表示,并将这些字节写入到输出流。 2. 反序列化:...

    thrift框架示例

    它通过定义一种中间表示(IDL,Interface Definition Language),允许开发者在不同的编程语言之间进行数据序列化和远程过程调用(RPC)。Thrift的主要目标是解决大型分布式系统中的通信问题,使得服务间的通信变得...

    thrift介绍与实践

    Thrift支持高效的二进制序列化,使得数据在网络间传输时占用较少的带宽,提高了通信效率。相比于XML或JSON,Thrift的序列化格式更加紧凑且解析速度更快。 5. 服务模型 Thrift支持多种服务模型,包括单线程、多线程...

    thrift0.9.3附带jar包

    7. **序列化与反序列化**:Thrift 自带高效的二进制编码格式,用于数据的序列化和反序列化,确保数据在网络间高效传输。 8. **扩展性**:Thrift 可以与其他技术结合,如数据库、消息队列等,构建更复杂的分布式系统...

    thrift样例操作实例

    此外,你还需要了解如何配置和运行Thrift服务以及客户端,这通常涉及到网络通信、序列化和反序列化等概念。通过实践这些样例,你可以深入理解Thrift的工作原理,并能够运用到自己的分布式系统中。

    thrift例子

    5. **序列化与反序列化**:Thrift提供了高效的序列化和反序列化机制,使得数据能在不同语言之间无缝传递。它使用二进制协议,比基于文本的JSON或XML更加紧凑和快速。 6. **多语言支持**:Thrift的一大优势在于其跨...

    thrift-0.9.1.exe和thrift-0.9.2.exe

    这将生成一系列Java类,包括服务接口、服务实现模板、数据结构以及序列化/反序列化的代码。 标签"thrift"表明这个压缩包主要与Thrift框架有关,可能包含了一些基本的示例或者教程。在"使用例子.txt"文件中,可能...

    thrift 0.9.2

    Thrift 0.9.2 是 Facebook 开源的一款高效、跨语言的服务开发框架,它主要设计用于解决在大规模分布式系统中的数据序列化和通信问题。Thrift 允许开发者定义服务接口、数据类型和服务行为,然后自动生成针对多种编程...

    Laravel开发-thrift-laravel

    2. **高性能通信**:Thrift-Laravel利用Thrift的高效序列化和反序列化机制,实现快速的数据交换,尤其适合大数据量和高并发场景。 3. **多语言支持**:由于Thrift支持多种语言,使用Thrift-Laravel可以轻松地在...

    Thrift--JSClient

    2. **Thrift协议**:讲解Thrift的二进制传输协议,如何高效地序列化和反序列化数据,以实现跨语言通信。 3. **JavaScript客户端API**:详细阐述JavaScript客户端库的使用,包括连接到Thrift服务器、调用服务方法、...

    Thrift demo

    例如,对于上面的服务定义,编译器会生成服务器端和客户端的 stub 类,这些类包含了处理服务调用的逻辑和序列化/反序列化的功能。 4. **传输层**: Thrift 提供了多种传输协议,包括 TCP、HTTP、HTTPS、本地套接字...

    thrift中间件实例代码

    6. **数据序列化与反序列化**:Thrift负责将数据结构在不同语言间进行序列化和反序列化,确保它们可以正确地在网络中传输。这是通过定义的数据结构类自动完成的,无需手动处理。 7. **网络通信**:Thrift支持多种...

    Thrift架构介绍.docx

    序列化和反序列化也是这一层的主要职责。 3. **Processor层**:Processor层封装了处理输入和输出数据流的逻辑,使用Protocol对象读写数据。它基于.thrift文件生成特定语言的源代码,负责服务的实际业务逻辑。 4. *...

Global site tag (gtag.js) - Google Analytics