77import java .nio .charset .StandardCharsets ;
88import java .util .ArrayList ;
99import java .util .List ;
10+ import java .util .Timer ;
11+ import java .util .TimerTask ;
12+ import java .util .concurrent .ThreadLocalRandom ;
1013
1114public class ClusterWS {
1215 private Socket mSocket ;
@@ -17,20 +20,30 @@ public class ClusterWS {
1720 private MessageHandler mMessageHandler ;
1821 private PingHandler mPingHandler ;
1922 private List <Channel > mChannels ;
20- private ReconnectionHandler mReconnectionHandler ;
23+ private ReconnectionParams mReconnectionParams ;
2124
2225 public ClusterWS (String url ) {
23- if (url == null ){
26+ if (url == null ) {
2427 throw new NullPointerException ("Url must be provided" );
2528 }
2629 mUrl = url ;
2730 mChannels = new ArrayList <>();
28- mReconnectionHandler = new ReconnectionHandler (null , null , null , null , this );
31+ mReconnectionParams = new ReconnectionParams (
32+ false ,
33+ null ,
34+ null ,
35+ null );
2936 createSocket ();
3037 }
3138
32- public ClusterWS setReconnection (Boolean autoReconnect , Integer reconnectionIntervalMin , Integer reconnectionIntervalMax , Integer reconnectionAttempts ) {
33- mReconnectionHandler = new ReconnectionHandler (autoReconnect , reconnectionIntervalMin , reconnectionIntervalMax , reconnectionAttempts , this );
39+ public ClusterWS setReconnection (Boolean autoReconnect ,
40+ Integer reconnectionIntervalMin ,
41+ Integer reconnectionIntervalMax ,
42+ Integer reconnectionAttempts ) {
43+ mReconnectionParams = new ReconnectionParams (autoReconnect ,
44+ reconnectionIntervalMin ,
45+ reconnectionIntervalMax ,
46+ reconnectionAttempts );
3447 return this ;
3548 }
3649
@@ -53,7 +66,7 @@ public void on(String event, IEmitterListener listener) {
5366 }
5467
5568 public void send (String event , Object data ) {
56- send (event ,data ,"emit" );
69+ send (event , data , "emit" );
5770 }
5871
5972 public WebSocket .READYSTATE getState () {
@@ -117,7 +130,7 @@ private void createSocket() {
117130 mSocket = new Socket (URI .create (mUrl ), new ISocketEvents () {
118131 @ Override
119132 public void onOpen () {
120- mReconnectionHandler . onOpen ();
133+ mClusterWSListener . onConnected ();
121134 }
122135
123136 @ Override
@@ -132,17 +145,22 @@ public void onClose(int code, String reason) {
132145 if (mPingHandler .getPingTimer () != null ) {
133146 mPingHandler .getPingTimer ().cancel ();
134147 }
135-
136- if (mReconnectionHandler .isInReconnectionState ()) {
137- return ;
138- }
139- if (mReconnectionHandler .isAutoReconnect () && code != 1000 ) {
140- mReconnectionHandler .reconnect ();
141- }
142-
143- if (mClusterWSListener != null ) {
144- mClusterWSListener .onDisconnected (code , reason );
148+ if (mReconnectionParams .isAutoReconnect () && code != 1000 && (mReconnectionParams .getReconnectionAttempts () == 0 || mReconnectionParams .getReconnectionsAttempted () < mReconnectionParams .getReconnectionAttempts ())) {
149+ if (mSocket .getReadyState () == WebSocket .READYSTATE .CLOSED || mSocket .getReadyState () == WebSocket .READYSTATE .NOT_YET_CONNECTED ) {
150+ mReconnectionParams .incrementReconnectionsAttempted ();
151+ int randomDelay = ThreadLocalRandom .current ().nextInt (1 ,
152+ mReconnectionParams .getReconnectionIntervalMax () -
153+ mReconnectionParams .getReconnectionIntervalMin () +
154+ 1 );
155+ new Timer ().schedule (new TimerTask () {
156+ @ Override
157+ public void run () {
158+ connect ();
159+ }
160+ }, randomDelay );
161+ }
145162 }
163+ mClusterWSListener .onDisconnected (code , reason );
146164 }
147165
148166 @ Override
@@ -170,5 +188,4 @@ private void onMessageReceived(String message) {
170188 mMessageHandler .messageDecode (ClusterWS .this , message );
171189 }
172190 }
173-
174191}
0 commit comments