-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtestWs.groovy
More file actions
123 lines (106 loc) · 3.67 KB
/
Copy pathtestWs.groovy
File metadata and controls
123 lines (106 loc) · 3.67 KB
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
@Grab(group='com.squareup.okhttp3', module='okhttp-ws', version='3.4.2')
import okio.*
import okhttp3.*
import okhttp3.ws.*
import java.util.concurrent.TimeUnit
import java.util.concurrent.atomic.AtomicBoolean
// Main starts here
final OkHttpClient client = new OkHttpClient.Builder().readTimeout(0, TimeUnit.MILLISECONDS).build()
final Request establishRequest = new Request.Builder().url("http://${args[0]}").build()
final Wrapper<WebSocket> wsWrapper = new Wrapper<>()
final AtomicBoolean opened = new AtomicBoolean(false)
final WebSocketListener listener = new MyWsListener(wsWrapper, opened)
println '> Start to establish connection...'
connect(client, establishRequest, listener, wsWrapper)
WebSocket ws = wsWrapper.get()
BufferedReader stdin = new BufferedReader(new InputStreamReader(System.in))
// Enter REPL loop
while (true) {
String line = stdin.readLine()
if (line == ':stop')
break
if (!opened.get()) {
println '> WebSocket closed. Re-establish connection.'
connect(client, establishRequest, listener, wsWrapper)
ws = wsWrapper.get()
}
if (line == ':ping') {
try {
ws.sendPing(null)
} catch (e) {
println "> Exception occurred when trying to send Ping message: ${e.class.name}"
e.printStackTrace()
handleException(ws, opened, e)
}
} else {
try {
ws.sendMessage(RequestBody.create(WebSocket.TEXT, line))
} catch (e) {
println "> Exception occurred when trying to send text message: ${e.class.name}"
e.printStackTrace()
handleException(ws, opened, e)
}
}
}
ws.close(1000, 'Client exit')
client.dispatcher().executorService().shutdown()
def connect(client, establishRequest, listener, wsWrapper) {
WebSocketCall call = WebSocketCall.create(client, establishRequest)
call.enqueue(listener)
synchronized (wsWrapper) {
wsWrapper.wait() // Wait for connection open
}
}
def handleException(ws, opened, e) {
if (e instanceof SocketException && e.message.equalsIgnoreCase("Socket closed")) {
opened.set(false)
}
}
// Listener for received message from server
public class MyWsListener implements WebSocketListener {
private Wrapper<WebSocket> wsWrapper;
private AtomicBoolean opened;
MyWsListener(Wrapper<WebSocket> wsWrapper, AtomicBoolean opened) {
this.wsWrapper = wsWrapper
this.opened = opened
}
public void onOpen(WebSocket webSocket, Response response) {
println '> Connection established.'
opened.compareAndSet(false, true)
wsWrapper.set(webSocket);
synchronized (wsWrapper) {
wsWrapper.notify()
}
}
public void onFailure(IOException e, Response response) {
println "> Exception occurred during the communication: ${e.class.name}"
e.printStackTrace()
synchronized (wsWrapper) {
wsWrapper.notify()
}
}
public void onMessage(ResponseBody message) throws IOException {
if (message.contentType().equals(WebSocket.TEXT)) // Interpret as UTF-8
println message.source().readUtf8()
else
println '> Received binary message from server.'
message.close()
}
public void onPong(Buffer payload) {
println '> Received Pong message from server.'
}
public void onClose(int code, String reason) {
println "> WebSocket closed on `$code:$reason`"
opened.compareAndSet(true, false)
}
}
// Util wrapper
public class Wrapper<T> {
private T inner;
public void set(T inner) {
this.inner = inner
}
public T get() {
return inner
}
}