我是靠谱客的博主 鳗鱼豌豆,这篇文章主要介绍使用OkHttp的WebSocket实现长连接,现在分享给大家,希望可以做个参考。

发送心跳包(定时检查是否连接状态)

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private long sendTime = 0L; // 发送心跳包 private Handler mHandler = new Handler(); // 每隔2秒发送一次心跳包,检测连接没有断开 private static final long HEART_BEAT_RATE = 10 * 1000; // 发送心跳包 private Runnable heartBeatRunnable = new Runnable() { @Override public void run() { if (System.currentTimeMillis() - sendTime >= HEART_BEAT_RATE) { //发送心跳包 String message = "{"type":"quote"}"; mWebSocket.send(message); sendTime = System.currentTimeMillis(); } mHandler.postDelayed(this, HEART_BEAT_RATE); //每隔一定的时间,对长连接进行一次心跳检测 } };

初始化的时候

复制代码
1
2
3
4
// 刚进入界面,就开启心跳检测 mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE); connectWebSocket();

WebSocket返回的状态(注意返回的数据在子线程中,如果进行更新ui需要在主线程中更新,)

复制代码
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
public void connectWebSocket() { OkHttpClient client = new OkHttpClient.Builder() .retryOnConnectionFailure(true)//允许失败重试 .readTimeout(5, TimeUnit.SECONDS)//设置读取超时时间 .writeTimeout(5, TimeUnit.SECONDS)//设置写的超时时间 .connectTimeout(5, TimeUnit.SECONDS)//设置连接超时时间 .build(); String url = "ws://www.xxx.com/websocket";//web.xxx.xxx.com:xxx//服务器获取的url Request request = new Request.Builder().url(url).build(); WebSocket webSocket = client.newWebSocket(request, new WebSocketListener() { //主要的几个方法(在子线程中回调,刷新UI记得使用Handler) @Override public void onOpen(WebSocket webSocket, Response response) { super.onOpen(webSocket, response); mWebSocket = webSocket; webSocket.send("{"type":"quote"}"); //连接成功 } @Override public void onMessage(WebSocket webSocket, String text) { super.onMessage(webSocket, text); //这里是子线程,不能再子线程中更新ui if (text.contains("connect")) { return; } else { list = new Gson().fromJson(text, WebBean.class).getData(); // 往handler发送一条消息 更改button的text属性 Message message = handler.obtainMessage(); message.obj=list; message.what = 20; handler.sendMessage(message); } } @Override public void onMessage(WebSocket webSocket, ByteString bytes) { super.onMessage(webSocket, bytes); } @Override public void onFailure(WebSocket webSocket, Throwable t, @Nullable Response response) { super.onFailure(webSocket, t, response); //连接失败调用 异常信息t.getMessage() //要延迟关闭socket try { webSocket.close(1000, null); mHandler.postDelayed(new Runnable() { @Override public void run() { connectWebSocket(); } },2000); } catch (Exception e) { e.printStackTrace(); } } }); }
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
```css @Override public void onDestroy() { super.onDestroy(); // 清除handler后,就不能再发送数据了 if (mHandler != null) { mHandler.removeCallbacksAndMessages(null); mHandler = null; } if (mWebSocket != null) { mWebSocket.close(1000, null); } if (mHandler != null) { mHandler.removeCallbacksAndMessages(null); mHandler = null; } //清空handler if (handler!=null){ handler.removeCallbacksAndMessages(null); handler = null; } }
复制代码
1
2

最后

以上就是鳗鱼豌豆最近收集整理的关于使用OkHttp的WebSocket实现长连接的全部内容,更多相关使用OkHttp内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(97)

评论列表共有 0 条评论

立即
投稿
返回
顶部