项目中需要实现一个类似心跳包的内容,语音通话期间,需要不断的请求服务器发送数据,确保正在连接中,开始想到的是使用service开启子线程,定时请求接口发送数据,但数据量很大时,http请求头部太大,每次请求需要发送重复的头数据,非常消耗流量,于是考虑使用长连接的方式。Android中实现WebSocket有很多种方式,这里说一下okHttp的方式。先来大致了解一下websocket。
- WebSocket属于双向通信协议,Http是单向的
- webSocket是需要握手进行建立连接的,只是在建立握手时,数据是通过HTTP传输的,但建立之后传输数据不需要http协议
- websocket的请求链接不是http://这种,而是以ws://开头
- websocket的Connection链接类型是 Upgrade:websocket,表示将该请求升级为websocket。
- websocket的头部响应码是101,表示本次链接的http协议即将被更改为upgrade:websocket 指定的协议。
使用okhttp封装websocketdemo
public class WebSocketDemo {
private final String TAG = WebSocketDemo.class.getSimpleName();
private OkHttpClient CLIENT;
private WebSocket mWebSocket;
private static WebSocketDemo ourInstance;
public static WebSocketDemo getDefault() {
if (ourInstance == null) {
synchronized (WebSocketDemo.class) {
if (ourInstance == null) {
ourInstance = new WebSocketDemo();
}
}
}
return ourInstance;
}
private WebSocketDemo() {
CLIENT = new OkHttpClient.Builder()
.writeTimeout(5, TimeUnit.SECONDS)
.readTimeout(5, TimeUnit.SECONDS)
.connectTimeout(5, TimeUnit.SECONDS)
.build();
}
public void connect(String url) {
if (mWebSocket != null) {
mWebSocket.cancel();
}
Request request = new Request.Builder()
.url(url)
.build();
mWebSocket = CLIENT.newWebSocket(request, new SocketListener());
}
public void sendMessage(String message) {
mWebSocket.send(message);
}
public void sendMes