18
18
19
19
import android .net .http .AndroidHttpClient ;
20
20
import android .os .Looper ;
21
+ import android .text .TextUtils ;
21
22
import android .util .Log ;
22
23
23
24
public class SocketIOClient {
24
25
public static interface Handler {
25
26
public void onConnect ();
26
27
28
+ public void onConnectToEndpoint (String endpoint );
29
+
27
30
public void on (String event , JSONArray arguments );
28
31
29
32
public void onDisconnect (int code , String reason );
@@ -36,16 +39,28 @@ public static interface Handler {
36
39
}
37
40
38
41
private static final String TAG = "SocketIOClient" ;
39
-
42
+
40
43
String mURL ;
41
44
Handler mHandler ;
42
45
String mSession ;
43
46
int mHeartbeat ;
44
47
WebSocketClient mClient ;
48
+ String mEndpoint ;
45
49
46
50
public SocketIOClient (URI uri , Handler handler ) {
47
- // remove trailing "/" from URI, in case user provided e.g. http://test.com/
48
- mURL = uri .toString ().replaceAll ("/$" , "" ) + "/socket.io/1/" ;
51
+ this (uri , handler , null );
52
+ }
53
+
54
+ public SocketIOClient (URI uri , Handler handler , String namespace ) {
55
+ mEndpoint = namespace ;
56
+
57
+ if (TextUtils .isEmpty (namespace )) {
58
+ mEndpoint = "socket.io" ;
59
+ }
60
+
61
+ // remove trailing "/" from URI, in case user provided e.g.
62
+ // http://test.com/
63
+ mURL = uri .toString ().replaceAll ("/$" , "" ) + "/" + mEndpoint + "/1/" ;
49
64
mHandler = handler ;
50
65
}
51
66
@@ -54,8 +69,7 @@ private static String downloadUriAsString(final HttpUriRequest req) throws IOExc
54
69
try {
55
70
HttpResponse res = client .execute (req );
56
71
return readToEnd (res .getEntity ().getContent ());
57
- }
58
- finally {
72
+ } finally {
59
73
client .close ();
60
74
}
61
75
}
@@ -91,21 +105,21 @@ public void run() {
91
105
}
92
106
});
93
107
}
94
-
108
+
95
109
public void emit (final String message ) {
96
110
mSendHandler .post (new Runnable () {
97
-
111
+
98
112
@ Override
99
113
public void run () {
100
114
mClient .send (String .format ("3:::%s" , message ));
101
115
}
102
116
});
103
117
}
104
-
118
+
105
119
public void emit (final JSONObject jsonMessage ) {
106
-
120
+
107
121
mSendHandler .post (new Runnable () {
108
-
122
+
109
123
@ Override
110
124
public void run () {
111
125
mClient .send (String .format ("4:::%s" , jsonMessage .toString ()));
@@ -130,7 +144,11 @@ public void onMessage(String message) {
130
144
switch (code ) {
131
145
case 1 :
132
146
// connect
133
- mHandler .onConnect ();
147
+ if (!TextUtils .isEmpty (parts [2 ])) {
148
+ mHandler .onConnectToEndpoint (parts [2 ]);
149
+ } else {
150
+ mHandler .onConnect ();
151
+ }
134
152
break ;
135
153
case 2 :
136
154
// heartbeat
@@ -140,10 +158,10 @@ public void onMessage(String message) {
140
158
// message
141
159
final String messageId = parts [1 ];
142
160
final String dataString = parts [3 ];
143
-
144
- if (!"" .equals (messageId )) {
161
+
162
+ if (!"" .equals (messageId )) {
145
163
mSendHandler .post (new Runnable () {
146
-
164
+
147
165
@ Override
148
166
public void run () {
149
167
mClient .send (String .format ("6:::%s" , messageId ));
@@ -154,20 +172,20 @@ public void run() {
154
172
break ;
155
173
}
156
174
case 4 : {
157
- //json message
175
+ // json message
158
176
final String messageId = parts [1 ];
159
177
final String dataString = parts [3 ];
160
-
178
+
161
179
JSONObject jsonMessage = null ;
162
-
180
+
163
181
try {
164
182
jsonMessage = new JSONObject (dataString );
165
- } catch (JSONException e ) {
183
+ } catch (JSONException e ) {
166
184
jsonMessage = new JSONObject ();
167
185
}
168
- if (!"" .equals (messageId )) {
186
+ if (!"" .equals (messageId )) {
169
187
mSendHandler .post (new Runnable () {
170
-
188
+
171
189
@ Override
172
190
public void run () {
173
191
mClient .send (String .format ("6:::%s" , messageId ));
@@ -211,8 +229,7 @@ public void run() {
211
229
default :
212
230
throw new Exception ("unknown code" );
213
231
}
214
- }
215
- catch (Exception ex ) {
232
+ } catch (Exception ex ) {
216
233
cleanup ();
217
234
onError (ex );
218
235
}
@@ -252,7 +269,7 @@ public void disconnect() throws IOException {
252
269
private void cleanup () {
253
270
mClient .disconnect ();
254
271
mClient = null ;
255
-
272
+
256
273
mSendLooper .quit ();
257
274
mSendLooper = null ;
258
275
mSendHandler = null ;
@@ -284,12 +301,68 @@ public void run() {
284
301
connectSession ();
285
302
286
303
Looper .loop ();
287
- }
288
- catch (Exception e ) {
304
+ } catch (Exception e ) {
289
305
mHandler .onError (e );
290
306
}
291
307
};
292
308
}.start ();
293
309
}
294
- }
295
310
311
+ /**
312
+ * Connect to an endpoint
313
+ */
314
+ public void connectToEndpoint (final String endpoint ) {
315
+
316
+ if (mClient .isConnected () && !TextUtils .isEmpty (endpoint )) {
317
+ mEndpoint = endpoint ;
318
+ mSendHandler .post (new Runnable () {
319
+
320
+ @ Override
321
+ public void run () {
322
+ mClient .send ("1::" + endpoint );
323
+ }
324
+ });
325
+ }
326
+ }
327
+
328
+ /**
329
+ * Disconnect from an endpoint or socket
330
+ *
331
+ * @param endpoint
332
+ * {@code null} to disconnect the entire socket, otherwise the
333
+ * endpoint to disconnect from
334
+ */
335
+ public void sendDisconnect (final String endpoint ) {
336
+
337
+ if (TextUtils .isEmpty (endpoint )) {
338
+
339
+ mSendHandler .post (new Runnable () {
340
+
341
+ @ Override
342
+ public void run () {
343
+ mClient .send ("0" );
344
+ }
345
+ });
346
+ }
347
+
348
+ else {
349
+ mSendHandler .post (new Runnable () {
350
+
351
+ @ Override
352
+ public void run () {
353
+ mClient .send ("0::" + endpoint );
354
+ }
355
+ });
356
+ }
357
+ }
358
+
359
+ /**
360
+ * Get the current connected endpoint
361
+ *
362
+ * @return The current connected endpoint, "socket.io" if connected to the
363
+ * default endpoint
364
+ */
365
+ public String getConnectedEndpoint () {
366
+ return mEndpoint ;
367
+ }
368
+ }
0 commit comments