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