文章目录
Demo源码请点击(网络库中websocket部分)
1.背景
一般使用到websocket协议的应用场景都是持续保持长连接,直到业务处理完毕,不再需要保持连接时,则close掉连接。那么官方给出的指导使用文档足咦。我近期工作上接到的任务是,通过websocket协议,流式接收数据。一次任务结束后要求关掉连接,下次任务再重新建立连接。要求减少服务器并发连接数,忽略建立连接的资源消耗。所以本篇文章是介绍再实例化连接的client之后,不关闭分发执行service的前提下,每次都新建websocket连接。整个源码放在了我封装的网络请求框架里。
2.源码解析
2.1基础封装
public class WebSocketClient {
private Request request;
private OkHttpClient client;
private WebSocket webSocket;
public WebSocketClient() {
client = new OkHttpClient();
request = new Request.Builder()
.url("ws://echo.websocket.org")
.build();
}
public OkHttpClient getClient() {
return client;
}
public void start(WebSocketListener listener) {
client.dispatcher().cancelAll();
HLogger.d("request id = " + request.toString());
HLogger.d("listener id = " + listener.toString());
webSocket = client.newWebSocket(request, listener);
HLogger.d("webSocket id = " + webSocket.toString());
}
public void close() {
if (webSocket != null) {
webSocket.close(1000, null);
}
client.dispatcher().executorService().shutdown();
}
}
以上是对Request、OkHttpClient、WebSocket的封装。基本保证只实例化一份Request、OkHttpClient,每次新任务newWebSocket。回调listener可以复用。
2.2使用
HsjWebSocketListener listener = new HsjWebSocketListener();
StringBuilder stringBuilder = new StringBuilder();
public void initSocket(View view) {
webSocketClient = new WebSocketClient();
}
public void webSocket(View view) {
if (webSocketClient == null