-
Notifications
You must be signed in to change notification settings - Fork 9.1k
/
WebSocketEcho.java
80 lines (67 loc) · 2.49 KB
/
WebSocketEcho.java
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
package okhttp3.recipes;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;
import okhttp3.ResponseBody;
import okhttp3.ws.WebSocket;
import okhttp3.ws.WebSocketCall;
import okhttp3.ws.WebSocketListener;
import okio.Buffer;
import okio.ByteString;
import static okhttp3.ws.WebSocket.BINARY;
import static okhttp3.ws.WebSocket.TEXT;
public final class WebSocketEcho implements WebSocketListener {
private final ExecutorService writeExecutor = Executors.newSingleThreadExecutor();
private void run() throws IOException {
OkHttpClient client = new OkHttpClient.Builder()
.readTimeout(0, TimeUnit.MILLISECONDS)
.build();
Request request = new Request.Builder()
.url("ws://echo.websocket.org")
.build();
WebSocketCall.create(client, request).enqueue(this);
// Trigger shutdown of the dispatcher's executor so this process can exit cleanly.
client.dispatcher().executorService().shutdown();
}
@Override public void onOpen(final WebSocket webSocket, Response response) {
writeExecutor.execute(new Runnable() {
@Override public void run() {
try {
webSocket.sendMessage(RequestBody.create(TEXT, "Hello..."));
webSocket.sendMessage(RequestBody.create(TEXT, "...World!"));
webSocket.sendMessage(RequestBody.create(BINARY, ByteString.decodeHex("deadbeef")));
webSocket.close(1000, "Goodbye, World!");
} catch (IOException e) {
System.err.println("Unable to send messages: " + e.getMessage());
}
}
});
}
@Override public void onMessage(ResponseBody message) throws IOException {
if (message.contentType() == TEXT) {
System.out.println("MESSAGE: " + message.string());
} else {
System.out.println("MESSAGE: " + message.source().readByteString().hex());
}
message.close();
}
@Override public void onPong(Buffer payload) {
System.out.println("PONG: " + payload.readUtf8());
}
@Override public void onClose(int code, String reason) {
System.out.println("CLOSE: " + code + " " + reason);
writeExecutor.shutdown();
}
@Override public void onFailure(IOException e, Response response) {
e.printStackTrace();
writeExecutor.shutdown();
}
public static void main(String... args) throws IOException {
new WebSocketEcho().run();
}
}