All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.github.linshenkx.rpcnettycommon.protocal.xuan.RemotingTransporter Maven / Gradle / Ivy

package com.github.linshenkx.rpcnettycommon.protocal.xuan;

import com.github.linshenkx.rpcnettycommon.bean.BodyContent;
import lombok.*;

import java.util.concurrent.atomic.AtomicLong;

/**
 * @version V1.0
 * @author: lin_shen
 * @date: 18-11-12
 * @Description: 自定义远程传输实体 (magic+flag+invokeId+bodyLength+bodyContent)
 */
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class RemotingTransporter {

    /**
     * 魔数
     */
    public static final short MAGIC=(short)0x9826;

    /**
     * 用原子递增的方式来获取不重复invokeId
     */
    private static final AtomicLong invokeIdGnerator=new AtomicLong(0L);


    /**
     * 标志位, 一共8个地址位。
     * 低四位用来表示消息体数据用的序列化工具的类型
     * 高四位中,第一位为1表示是request请求,为0表示是reponse应答
     * TODO:第二位为1表示双向传输(即有返回response)
     * TODO:第三位为1表示是心跳ping事件
     * TODO:预留位
     */
    private Flag flag;

    @Getter
    @ToString
    public static class Flag{
        private boolean isRequest;
        private boolean isTwoway;
        private boolean isPing;
        private boolean isOther;

        private int serializeType;

        private byte thisByte;


        public Flag(boolean isRequest, boolean isTwoway, boolean isPing, boolean isOther, int serializeType) {

            if(serializeType<0||serializeType>15){
                throw new IllegalArgumentException("serializeType 对应整数应该在 0 到 15 之间");
            }

            this.isRequest = isRequest;
            this.isTwoway = isTwoway;
            this.isPing = isPing;
            this.isOther = isOther;
            this.serializeType = serializeType;

            int byteTem= (isRequest?1:0)<<7;
            byteTem=byteTem | ((isTwoway?1:0)<<6);
            byteTem=byteTem | ((isPing?1:0)<<5);
            byteTem=byteTem | ((isOther?1:0)<<4);
            byteTem=byteTem | serializeType;

            this.thisByte= (byte) byteTem;
        }

        public Flag(byte thisByte){
            this.thisByte=thisByte;

            isRequest=((thisByte>>>7)&1)==1;
            isTwoway=((thisByte>>>6)&1)==1;
            isPing=((thisByte>>>5)&1)==1;
            isOther=((thisByte>>>4)&1)==1;

            serializeType=thisByte & 15;

        }

    }


    /**
     * 每一个请求的唯一识别id(由于采用异步通讯的方式,用来把请求request和返回的response对应上)
     */
    private long invokeId=invokeIdGnerator.getAndIncrement();

    /**
     * 消息体字节数组长度
     */
    private int bodyLength;

    /**
     * 消息体内容(还需要编码序列化成字节数组)
     */
    private transient BodyContent bodyContent;


}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy