Android 浅析 okHttp WebSocket (一) 使用

前言

Linus Benedict Torvalds : RTFSC – Read The Funning Source Code

概括

okHttp 对于大家来说已经不再陌生了,使用起来也是非常的方便,本章开始将介绍利用 okHttp 进行 WebSocket 的使用。

本章的程序所使用的客户端和服务端皆出自okhttp,okhttp自带一套模仿服务端的操作。

使用

Step 1:构建服务端

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
// 创建全局对象 MockWebServer
private static final MockWebServer mMockWebServer = new MockWebServer();
// 创建对象 服务端响应对象
private MockResponse mMockResponse = null;
// 创建监听回调
public MockResponse createResponse() {
return new MockResponse().withWebSocketUpgrade(new WebSocketListener() {
@Override
public void onOpen(WebSocket webSocket, Response response) {
System.out.println("server onOpen: request header:" + response.request().headers() + " response header:" + response.headers() + " response:" + response);
}
@Override
public void onMessage(WebSocket webSocket, String string) {
System.out.println("server onMessage: message:" + string);
}
@Override
public void onClosing(WebSocket webSocket, int code, String reason) {
System.out.println("server onClosing: code:" + code + " reason:" + reason);
}
@Override
public void onClosed(WebSocket webSocket, int code, String reason) {
System.out.println("server onClosed code:" + code + " reason:" + reason);
}
@Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) {
System.out.println("server onFailure");
}
});
}
private void initMockServer() {
mMockResponse = createResponse();
mMockWebServer.enqueue(mMockResponse);
}

MockServer:okhttp提供的一个虚拟服务端类。可编写脚本的Web服务器。调用者提供固定响应,服务器按请求重新播放它们。

Step 2:构建客户端

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
// 新建client
private static final OkHttpClient mClient = new OkHttpClient.Builder().build();
// 创建请求回调
private WebSocketListener createListener() {
return new WebSocketListener() {
@Override
public void onOpen(WebSocket webSocket, Response response) {
mWebSocket = webSocket;
System.out.println("client onOpen");
System.out.println("client request header:" + response.request().headers());
System.out.println("client response header:" + response.headers());
System.out.println("client response:" + response);
}
@Override
public void onMessage(WebSocket webSocket, String text) {
System.out.println("client onMessage");
System.out.println("message:" + text);
}
@Override
public void onMessage(WebSocket webSocket, ByteString bytes) {
}
@Override
public void onClosing(WebSocket webSocket, int code, String reason) {
System.out.println("client onClosing");
System.out.println("code:" + code + " reason:" + reason);
}
@Override
public void onClosed(WebSocket webSocket, int code, String reason) {
System.out.println("client onClosed");
System.out.println("code:" + code + " reason:" + reason);
}
@Override
public void onFailure(WebSocket webSocket, Throwable t, Response response) {
System.out.println("client onFailure");
}
}
}
private static void initWsClient(String wsUrl) {
Request request = new Request.Builder().url(wsUrl).build();
WebSocketListener wbListener = createListener();
mClient.newWebSocket(request, wbListener);
}

Step 3:创建线程调用

1
2
3
4
5
6
7
new Thread(new Runnable() {
@Override
public void run() {
initMockServer();
initWsClient("ws://" + mMockWebServer.getHostName() + ":" + mMockWebServer.getPort() + "/");
}
}).start();

这样就完成了整个简单的调用流程。
完成了流程后我们就可以在应答中通过WebSocketsend(String text)将需要的信息发送给服务端或者客户端。

总结

简单的使用很容易就完成了,在使用的途中okhttp已经帮我们完成了虚拟的服务端构建,在接下来的章节会继续做深入的分析。