Skip to content

Commit 2ff1c69

Browse files
committed
socket.io reconnect should also reconnect any previously connected endpoints
1 parent 6d63777 commit 2ff1c69

File tree

2 files changed

+63
-16
lines changed

2 files changed

+63
-16
lines changed

AndroidAsync/src/com/koushikdutta/async/http/socketio/SocketIOConnection.java

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,13 @@
33
import android.os.Handler;
44
import android.text.TextUtils;
55

6-
import com.koushikdutta.async.AsyncServer;
76
import com.koushikdutta.async.NullDataCallback;
87
import com.koushikdutta.async.callback.CompletedCallback;
98
import com.koushikdutta.async.future.Cancellable;
109
import com.koushikdutta.async.future.DependentCancellable;
11-
import com.koushikdutta.async.future.Future;
12-
import com.koushikdutta.async.future.SimpleFuture;
1310
import com.koushikdutta.async.http.AsyncHttpClient;
1411
import com.koushikdutta.async.http.AsyncHttpResponse;
1512
import com.koushikdutta.async.http.WebSocket;
16-
import com.koushikdutta.async.http.server.AsyncHttpServer;
1713

1814
import org.json.JSONArray;
1915
import org.json.JSONObject;
@@ -94,12 +90,15 @@ void reconnect(final DependentCancellable child) {
9490
return;
9591
}
9692

93+
request.logi("Reconnecting socket.io");
94+
9795
// dont invoke onto main handler, as it is unnecessary until a session is ready or failed
9896
request.setHandler(null);
9997
// initiate a session
10098
Cancellable cancel = httpClient.executeString(request, new AsyncHttpClient.StringCallback() {
10199
@Override
102100
public void onCompleted(final Exception e, AsyncHttpResponse response, String result) {
101+
request.logi("socket.io session received");
103102
if (e != null) {
104103
reportDisconnect(e);
105104
return;
@@ -202,6 +201,12 @@ public void run() {
202201

203202
long reconnectDelay = 1000L;
204203
private void reportDisconnect(final Exception ex) {
204+
if (ex != null) {
205+
request.loge("socket.io disconnected", ex);
206+
}
207+
else {
208+
request.logi("socket.io disconnected");
209+
}
205210
select(null, new SelectCallback() {
206211
@Override
207212
public void onSelect(SocketIOClient client) {
@@ -393,5 +398,16 @@ public void onStringAvailable(String message) {
393398
}
394399
}
395400
});
401+
402+
// now reconnect all the sockets that may have been previously connected
403+
select(null, new SelectCallback() {
404+
@Override
405+
public void onSelect(SocketIOClient client) {
406+
if (TextUtils.isEmpty(client.endpoint))
407+
return;
408+
409+
connect(client);
410+
}
411+
});
396412
}
397413
}

AndroidAsyncTest/src/com/koushikdutta/async/test/SocketIOTests.java

Lines changed: 43 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,13 @@
2525

2626
public class SocketIOTests extends TestCase {
2727
public static final long TIMEOUT = 10000L;
28-
29-
28+
29+
@Override
30+
protected void tearDown() throws Exception {
31+
super.tearDown();
32+
AsyncServer.getDefault().stop();
33+
}
34+
3035
class TriggerFuture extends SimpleFuture<Boolean> {
3136
public void trigger(boolean val) {
3237
setComplete(val);
@@ -88,7 +93,7 @@ public void onString(String string, Acknowledge acknowledge) {
8893
});
8994
assertTrue(trigger.get(TIMEOUT, TimeUnit.MILLISECONDS));
9095
}
91-
96+
9297
public void testEchoServer() throws Exception {
9398
final TriggerFuture trigger1 = new TriggerFuture();
9499
final TriggerFuture trigger2 = new TriggerFuture();
@@ -136,12 +141,44 @@ public void onJSON(JSONObject json, Acknowledge acknowledge) {
136141
public void testReconnect() throws Exception {
137142
final TriggerFuture disconnectTrigger = new TriggerFuture();
138143
final TriggerFuture reconnectTrigger = new TriggerFuture();
144+
final TriggerFuture endpointReconnectTrigger = new TriggerFuture();
145+
final TriggerFuture echoTrigger = new TriggerFuture();
139146

140-
SocketIOClient.connect(AsyncHttpClient.getDefaultInstance(), "http://koush.clockworkmod.com:8080", new ConnectCallback() {
147+
SocketIORequest req = new SocketIORequest("http://koush.clockworkmod.com:8080");
148+
req.setLogging("socket.io", Log.VERBOSE);
149+
SocketIOClient.connect(AsyncHttpClient.getDefaultInstance(), req, new ConnectCallback() {
141150
@Override
142151
public void onConnectCompleted(Exception ex, final SocketIOClient client) {
143152
assertNull(ex);
144153

154+
client.of("/chat", new ConnectCallback() {
155+
@Override
156+
public void onConnectCompleted(Exception ex, final SocketIOClient client) {
157+
client.setReconnectCallback(new ReconnectCallback() {
158+
@Override
159+
public void onReconnect() {
160+
client.emit("hello");
161+
endpointReconnectTrigger.trigger(true);
162+
}
163+
});
164+
165+
client.setStringCallback(new StringCallback() {
166+
@Override
167+
public void onString(String string, Acknowledge acknowledge) {
168+
echoTrigger.trigger("hello".equals(string));
169+
}
170+
});
171+
172+
AsyncServer.getDefault().postDelayed(new Runnable() {
173+
@Override
174+
public void run() {
175+
// this will trigger a reconnect
176+
client.getWebSocket().close();
177+
}
178+
}, 200);
179+
}
180+
});
181+
145182
client.setDisconnectCallback(new DisconnectCallback() {
146183
@Override
147184
public void onDisconnect(Exception e) {
@@ -155,19 +192,13 @@ public void onReconnect() {
155192
reconnectTrigger.trigger(true);
156193
}
157194
});
158-
159-
AsyncServer.getDefault().postDelayed(new Runnable() {
160-
@Override
161-
public void run() {
162-
// this will trigger a reconnect
163-
client.getWebSocket().close();
164-
}
165-
}, 200);
166195
}
167196
});
168197

169198
assertTrue(disconnectTrigger.get(TIMEOUT, TimeUnit.MILLISECONDS));
170199
assertTrue(reconnectTrigger.get(TIMEOUT, TimeUnit.MILLISECONDS));
200+
assertTrue(endpointReconnectTrigger.get(TIMEOUT, TimeUnit.MILLISECONDS));
201+
assertTrue(echoTrigger.get(TIMEOUT, TimeUnit.MILLISECONDS));
171202
}
172203

173204
public void testEventAck() throws Exception {

0 commit comments

Comments
 (0)