package com.easysocket.config; 
 | 
  
 | 
import com.easysocket.connection.reconnect.AbsReconnection; 
 | 
import com.easysocket.connection.reconnect.DefaultReConnection; 
 | 
import com.easysocket.entity.SocketAddress; 
 | 
import com.easysocket.interfaces.config.IMessageProtocol; 
 | 
  
 | 
import java.nio.ByteOrder; 
 | 
  
 | 
/** 
 | 
 * Author:Alex。 
 | 
 * Date:2019/5/31。 
 | 
 * Note:socket相关配置。 
 | 
 */ 
 | 
public class EasySocketOptions { 
 | 
  
 | 
    /** 
 | 
     * 是否调试模式 
 | 
     */ 
 | 
    private static boolean isDebug = true; 
 | 
    /** 
 | 
     * 主机地址 
 | 
     */ 
 | 
    private SocketAddress socketAddress; 
 | 
    /** 
 | 
     * 备用主机地址 
 | 
     */ 
 | 
    private SocketAddress backupAddress; 
 | 
    /** 
 | 
     * 写入Socket管道的字节序 
 | 
     */ 
 | 
    private ByteOrder writeOrder; 
 | 
    /** 
 | 
     * 从Socket读取字节时的字节序 
 | 
     */ 
 | 
    private ByteOrder readOrder; 
 | 
    /** 
 | 
     * 从socket读取数据时遵从的数据包结构协议,在业务层进行定义 
 | 
     */ 
 | 
    private IMessageProtocol messageProtocol; 
 | 
    /** 
 | 
     * 写数据时单个数据包的最大值 
 | 
     */ 
 | 
    private int maxWriteBytes; 
 | 
    /** 
 | 
     * 读数据时单次读取最大缓存值,数值越大效率越高,但是系统消耗也越大 
 | 
     */ 
 | 
    private int maxReadBytes; 
 | 
    /** 
 | 
     * 心跳频率/毫秒 
 | 
     */ 
 | 
    private long heartbeatFreq; 
 | 
    /** 
 | 
     * 心跳最大的丢失次数,大于这个数据,将断开socket连接 
 | 
     */ 
 | 
    private int maxHeartbeatLoseTimes; 
 | 
    /** 
 | 
     * 连接超时时间(毫秒) 
 | 
     */ 
 | 
    private int connectTimeout; 
 | 
    /** 
 | 
     * 服务器返回数据的最大值(单位Mb),防止客户端内存溢出 
 | 
     */ 
 | 
    private int maxResponseDataMb; 
 | 
    /** 
 | 
     * socket重连管理器 
 | 
     */ 
 | 
    private AbsReconnection reconnectionManager; 
 | 
    /** 
 | 
     * 安全套接字相关配置 
 | 
     */ 
 | 
    private SocketSSLConfig easySSLConfig; 
 | 
    /** 
 | 
     * socket工厂 
 | 
     */ 
 | 
    private SocketFactory socketFactory; 
 | 
    /** 
 | 
     * 实现回调功能需要callbackID,而callbackID是保存在发送消息和应答消息中的,此工厂用来获取socket消息中 
 | 
     * 保存callbackID值的key,比如json格式中的key-value中的key 
 | 
     */ 
 | 
    private CallbackIDFactory callbackIDFactory; 
 | 
    /** 
 | 
     * 请求超时时间,单位毫秒 
 | 
     */ 
 | 
    private long requestTimeout; 
 | 
    /** 
 | 
     * 是否开启请求超时检测 
 | 
     */ 
 | 
    private boolean isOpenRequestTimeout; 
 | 
  
 | 
    /** 
 | 
     * IO字符流的编码方式,默认utf-8 
 | 
     */ 
 | 
    private String charsetName; 
 | 
  
 | 
    public boolean isDebug() { 
 | 
        return isDebug; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 静态内部类 
 | 
     */ 
 | 
    public static class Builder { 
 | 
        EasySocketOptions socketOptions; 
 | 
  
 | 
        // 首先获得一个默认的配置 
 | 
        public Builder() { 
 | 
            this(getDefaultOptions()); 
 | 
        } 
 | 
  
 | 
        public Builder(EasySocketOptions defaultOptions) { 
 | 
            socketOptions = defaultOptions; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 设置socket 主机地址 
 | 
         * 
 | 
         * @param socketAddress 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setSocketAddress(SocketAddress socketAddress) { 
 | 
            socketOptions.socketAddress = socketAddress; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 设置备用的主机地址 
 | 
         * 
 | 
         * @param backupAddress 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setBackupAddress(SocketAddress backupAddress) { 
 | 
            socketOptions.backupAddress = backupAddress; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 设置是否开启请求超时的检测 
 | 
         * 
 | 
         * @param openRequestTimeout 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setOpenRequestTimeout(boolean openRequestTimeout) { 
 | 
            socketOptions.isOpenRequestTimeout = openRequestTimeout; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 设置请求超时时间 
 | 
         * 
 | 
         * @param requestTimeout 毫秒 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setRequestTimeout(long requestTimeout) { 
 | 
            socketOptions.requestTimeout = requestTimeout; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 设置请求ack的工厂 
 | 
         * 
 | 
         * @param callbackIDFactory 
 | 
         */ 
 | 
        public Builder setCallbackIDFactory(CallbackIDFactory callbackIDFactory) { 
 | 
            socketOptions.callbackIDFactory = callbackIDFactory; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
  
 | 
        /** 
 | 
         * 设置写数据的字节顺序 
 | 
         * 
 | 
         * @param writeOrder 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setWriteOrder(ByteOrder writeOrder) { 
 | 
            socketOptions.writeOrder = writeOrder; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 设置读数据的字节顺序 
 | 
         * 
 | 
         * @param readOrder 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setReadOrder(ByteOrder readOrder) { 
 | 
            socketOptions.readOrder = readOrder; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 设置读取数据的数据结构协议 
 | 
         * 
 | 
         * @param readerProtocol 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setReaderProtocol(IMessageProtocol readerProtocol) { 
 | 
            socketOptions.messageProtocol = readerProtocol; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 设置写数据时单个数据包的最大值 
 | 
         * 
 | 
         * @param maxWriteBytes 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setMaxWriteBytes(int maxWriteBytes) { 
 | 
            socketOptions.maxWriteBytes = maxWriteBytes; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 设置读数据时单次读取的最大缓存值 
 | 
         * 
 | 
         * @param maxReadBytes 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setMaxReadBytes(int maxReadBytes) { 
 | 
            socketOptions.maxReadBytes = maxReadBytes; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 设置心跳发送频率,单位毫秒 
 | 
         * 
 | 
         * @param heartbeatFreq 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setHeartbeatFreq(long heartbeatFreq) { 
 | 
            socketOptions.heartbeatFreq = heartbeatFreq; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 设置心跳丢失的最大允许数,如果超过这个最大数就断开socket连接 
 | 
         * 
 | 
         * @param maxHeartbeatLoseTimes 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setMaxHeartbeatLoseTimes(int maxHeartbeatLoseTimes) { 
 | 
            socketOptions.maxHeartbeatLoseTimes = maxHeartbeatLoseTimes; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 设置连接超时时间 
 | 
         * 
 | 
         * @param connectTimeout 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setConnectTimeout(int connectTimeout) { 
 | 
            socketOptions.connectTimeout = connectTimeout; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 设置服务器返回数据的允许的最大值,单位兆 
 | 
         * 
 | 
         * @param maxResponseDataMb 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setMaxResponseDataMb(int maxResponseDataMb) { 
 | 
            socketOptions.maxResponseDataMb = maxResponseDataMb; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 设置重连管理器 
 | 
         * 
 | 
         * @param reconnectionManager 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setReconnectionManager(AbsReconnection reconnectionManager) { 
 | 
            socketOptions.reconnectionManager = reconnectionManager; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 安全套接字的配置 
 | 
         * 
 | 
         * @param easySSLConfig 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setEasySSLConfig(SocketSSLConfig easySSLConfig) { 
 | 
            socketOptions.easySSLConfig = easySSLConfig; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        /** 
 | 
         * 自定义创建socket工厂 
 | 
         * 
 | 
         * @param socketFactory 
 | 
         * @return 
 | 
         */ 
 | 
        public Builder setSocketFactory(SocketFactory socketFactory) { 
 | 
            socketOptions.socketFactory = socketFactory; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        public Builder setCharsetName(String charsetName) { 
 | 
            socketOptions.charsetName = charsetName; 
 | 
            return this; 
 | 
        } 
 | 
  
 | 
        public EasySocketOptions build() { 
 | 
            return socketOptions; 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 获取默认的配置 
 | 
     * 
 | 
     * @return 
 | 
     */ 
 | 
    public static EasySocketOptions getDefaultOptions() { 
 | 
        EasySocketOptions options = new EasySocketOptions(); 
 | 
        options.socketAddress = null; 
 | 
        options.backupAddress = null; 
 | 
        options.heartbeatFreq = 5 * 1000; 
 | 
        options.messageProtocol = null; 
 | 
        options.maxResponseDataMb = 5; 
 | 
        options.connectTimeout = 5 * 1000; // 连接超时默认5秒 
 | 
        options.maxWriteBytes = 100; 
 | 
        options.maxReadBytes = 50; 
 | 
        options.readOrder = ByteOrder.BIG_ENDIAN; 
 | 
        options.writeOrder = ByteOrder.BIG_ENDIAN; 
 | 
        options.maxHeartbeatLoseTimes = 5; 
 | 
        options.reconnectionManager = new DefaultReConnection(); 
 | 
        options.easySSLConfig = null; 
 | 
        options.socketFactory = null; 
 | 
        options.callbackIDFactory = null; 
 | 
        options.requestTimeout = 10 * 1000; // 默认十秒 
 | 
        options.isOpenRequestTimeout = true; // 默认开启 
 | 
        options.charsetName = "UTF-8"; 
 | 
        return options; 
 | 
    } 
 | 
  
 | 
    public String getCharsetName() { 
 | 
        return charsetName; 
 | 
    } 
 | 
  
 | 
    public ByteOrder getWriteOrder() { 
 | 
        return writeOrder; 
 | 
    } 
 | 
  
 | 
    public ByteOrder getReadOrder() { 
 | 
        return readOrder; 
 | 
    } 
 | 
  
 | 
    public IMessageProtocol getMessageProtocol() { 
 | 
        return messageProtocol; 
 | 
    } 
 | 
  
 | 
    public int getMaxWriteBytes() { 
 | 
        return maxWriteBytes; 
 | 
    } 
 | 
  
 | 
    public int getMaxReadBytes() { 
 | 
        return maxReadBytes; 
 | 
    } 
 | 
  
 | 
    public long getHeartbeatFreq() { 
 | 
        return heartbeatFreq; 
 | 
    } 
 | 
  
 | 
    public int getMaxHeartbeatLoseTimes() { 
 | 
        return maxHeartbeatLoseTimes; 
 | 
    } 
 | 
  
 | 
    public int getConnectTimeout() { 
 | 
        return connectTimeout; 
 | 
    } 
 | 
  
 | 
    public int getMaxResponseDataMb() { 
 | 
        return maxResponseDataMb; 
 | 
    } 
 | 
  
 | 
    public AbsReconnection getReconnectionManager() { 
 | 
        return reconnectionManager; 
 | 
    } 
 | 
  
 | 
    public SocketSSLConfig getEasySSLConfig() { 
 | 
        return easySSLConfig; 
 | 
    } 
 | 
  
 | 
    public SocketFactory getSocketFactory() { 
 | 
        return socketFactory; 
 | 
    } 
 | 
  
 | 
    public long getRequestTimeout() { 
 | 
        return requestTimeout; 
 | 
    } 
 | 
  
 | 
    public boolean isOpenRequestTimeout() { 
 | 
        return isOpenRequestTimeout; 
 | 
    } 
 | 
  
 | 
    public CallbackIDFactory getCallbackIDFactory() { 
 | 
        return callbackIDFactory; 
 | 
    } 
 | 
  
 | 
    public static void setIsDebug(boolean isDebug) { 
 | 
        EasySocketOptions.isDebug = isDebug; 
 | 
    } 
 | 
  
 | 
    public void setWriteOrder(ByteOrder writeOrder) { 
 | 
        this.writeOrder = writeOrder; 
 | 
    } 
 | 
  
 | 
    public void setReadOrder(ByteOrder readOrder) { 
 | 
        this.readOrder = readOrder; 
 | 
    } 
 | 
  
 | 
    public void setMessageProtocol(IMessageProtocol messageProtocol) { 
 | 
        this.messageProtocol = messageProtocol; 
 | 
    } 
 | 
  
 | 
    public void setMaxWriteBytes(int maxWriteBytes) { 
 | 
        this.maxWriteBytes = maxWriteBytes; 
 | 
    } 
 | 
  
 | 
    public void setMaxReadBytes(int maxReadBytes) { 
 | 
        this.maxReadBytes = maxReadBytes; 
 | 
    } 
 | 
  
 | 
    public void setHeartbeatFreq(long heartbeatFreq) { 
 | 
        this.heartbeatFreq = heartbeatFreq; 
 | 
    } 
 | 
  
 | 
    public void setMaxHeartbeatLoseTimes(int maxHeartbeatLoseTimes) { 
 | 
        this.maxHeartbeatLoseTimes = maxHeartbeatLoseTimes; 
 | 
    } 
 | 
  
 | 
    public void setConnectTimeout(int connectTimeout) { 
 | 
        this.connectTimeout = connectTimeout; 
 | 
    } 
 | 
  
 | 
    public void setMaxResponseDataMb(int maxResponseDataMb) { 
 | 
        this.maxResponseDataMb = maxResponseDataMb; 
 | 
    } 
 | 
  
 | 
    public void setReconnectionManager(AbsReconnection reconnectionManager) { 
 | 
        this.reconnectionManager = reconnectionManager; 
 | 
    } 
 | 
  
 | 
    public void setEasySSLConfig(SocketSSLConfig easySSLConfig) { 
 | 
        this.easySSLConfig = easySSLConfig; 
 | 
    } 
 | 
  
 | 
    public void setSocketFactory(SocketFactory socketFactory) { 
 | 
        this.socketFactory = socketFactory; 
 | 
    } 
 | 
  
 | 
    public void setCallbackIDFactory(CallbackIDFactory callbackIDFactory) { 
 | 
        this.callbackIDFactory = callbackIDFactory; 
 | 
    } 
 | 
  
 | 
    public void setRequestTimeout(long requestTimeout) { 
 | 
        this.requestTimeout = requestTimeout; 
 | 
    } 
 | 
  
 | 
    public void setOpenRequestTimeout(boolean openRequestTimeout) { 
 | 
        isOpenRequestTimeout = openRequestTimeout; 
 | 
    } 
 | 
  
 | 
    public SocketAddress getSocketAddress() { 
 | 
        return socketAddress; 
 | 
    } 
 | 
  
 | 
    public SocketAddress getBackupAddress() { 
 | 
        return backupAddress; 
 | 
    } 
 | 
  
 | 
} 
 |