Skip to content

Commit 545d3d7

Browse files
committed
Add experimental OkHttp3 websocket client support
Patch OkHttp3
1 parent 3b1dd4b commit 545d3d7

File tree

1 file changed

+104
-0
lines changed

1 file changed

+104
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
package com.parse;
2+
3+
import android.util.Log;
4+
5+
import java.net.URI;
6+
import java.util.Locale;
7+
8+
import okhttp3.OkHttpClient;
9+
import okhttp3.Request;
10+
import okhttp3.Response;
11+
import okhttp3.WebSocketListener;
12+
import okio.ByteString;
13+
14+
/* package */ class OkHttp3WebSocketClient implements WebSocketClient {
15+
16+
private static final String LOG_TAG = "OkHttpWebSocketClient";
17+
18+
private final WebSocketClientCallback webSocketClientCallback;
19+
private okhttp3.WebSocket webSocket;
20+
private State state = State.NONE;
21+
private OkHttpClient client;
22+
private final String url;
23+
private final int STATUS_CODE = 200;
24+
private final String CLOSING_MSG = "User invoked close";
25+
26+
private final WebSocketListener handler = new WebSocketListener() {
27+
@Override
28+
public void onOpen(okhttp3.WebSocket webSocket, Response response) {
29+
setState(State.CONNECTED);
30+
webSocketClientCallback.onOpen();
31+
}
32+
33+
@Override
34+
public void onMessage(okhttp3.WebSocket webSocket, String text) {
35+
webSocketClientCallback.onMessage(text);
36+
}
37+
38+
@Override
39+
public void onMessage(okhttp3.WebSocket webSocket, ByteString bytes) {
40+
Log.w(LOG_TAG, String.format(Locale.US, "Socket got into inconsistent state and received %s instead.", bytes.toString()));
41+
}
42+
43+
@Override
44+
public void onClosed(okhttp3.WebSocket webSocket, int code, String reason) {
45+
setState(State.DISCONNECTED);
46+
webSocketClientCallback.onClose();
47+
}
48+
49+
@Override
50+
public void onFailure(okhttp3.WebSocket webSocket, Throwable t, Response response) {
51+
webSocketClientCallback.onError(t);
52+
}
53+
};
54+
55+
private OkHttp3WebSocketClient(WebSocketClientCallback webSocketClientCallback, URI hostUrl) {
56+
this.webSocketClientCallback = webSocketClientCallback;
57+
client = new OkHttpClient();
58+
url = hostUrl.toString();
59+
}
60+
61+
@Override
62+
public synchronized void open() {
63+
if (State.NONE == state) {
64+
// OkHttp3 connects as soon as the socket is created so do it here.
65+
Request request = new Request.Builder()
66+
.url(url)
67+
.build();
68+
69+
webSocket = client.newWebSocket(request, handler);
70+
setState(State.CONNECTING);
71+
}
72+
}
73+
74+
@Override
75+
public synchronized void close() {
76+
setState(State.DISCONNECTING);
77+
webSocket.close(STATUS_CODE, CLOSING_MSG);
78+
}
79+
80+
@Override
81+
public void send(String message) {
82+
if (state == State.CONNECTED) {
83+
webSocket.send(message);
84+
}
85+
}
86+
87+
@Override
88+
public State getState() {
89+
return state;
90+
}
91+
92+
private synchronized void setState(State newState) {
93+
this.state = newState;
94+
this.webSocketClientCallback.stateChanged();
95+
}
96+
97+
/* package */ static class OkHttp3SocketClientFactory implements WebSocketClientFactory {
98+
@Override
99+
public WebSocketClient createInstance(WebSocketClientCallback webSocketClientCallback, URI hostUrl) {
100+
return new OkHttp3WebSocketClient(webSocketClientCallback, hostUrl);
101+
}
102+
}
103+
104+
}

0 commit comments

Comments
 (0)