zuoxiao
2024-03-04 4d2d9239d8915a030bb84cb2147774470b04bf27
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
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;
    }
 
}