1. 概述
这篇文章主要记录下,自己在项目中使用的,给服务器端每隔5秒发送心跳包和每隔5秒给服务器发送数据,交替执行。意思就是:在客户端的okhttp的websocket和服务器端建立长连接后,这个时候需要做的就是:
5秒之后给服务器发送一个心跳包,让服务器知道自己还活着,然后再过5秒后给服务器发送数据;
然后再过5秒后给服务器发送一个心跳包,让服务器知道自己还活着,然后再过5秒后给服务器发送数据;
然后再过5秒后给服务器发送一个心跳包,让服务器知道自己还活着,然后再过5秒后给服务器发送数据;
...
就是这样,二者交替执行;
2. 代码如下
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/8/11 8:19
* Version 1.0
* Params:
* Description:
*/
public class TestActivity extends BaseActivity {
private CountDownTimer countDownTimer;
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
}
@Override
public void initView() {
// 刚进入界面,就开启心跳检测
mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);
}
private long sendTime = 0L;
// 发送心跳包
private Handler mHandler = new Handler();
// 每隔2秒发送一次心跳包,检测连接没有断开
private static final long HEART_BEAT_RATE = 2 * 1000;
// 发完心跳包后,然后每隔5秒进行给服务器发送一次数据
private static final long DATA_RATE = 5 * 1000;
// 发送心跳包
private Runnable heartBeatRunnable = new Runnable() {
@Override
public void run() {
if (System.currentTimeMillis() - sendTime >= HEART_BEAT_RATE) {
// 发送心跳包
sendHeart();
sendTime = System.currentTimeMillis();
}
// mHandler.postDelayed(this, HEART_BEAT_RATE); //每隔一定的时间,对长连接进行一次心跳检测
// 发送完心跳包后,然后隔5秒再进行发数据
mHandler.postDelayed(dataRunnable, DATA_RATE);
}
};
private Runnable dataRunnable = new Runnable() {
@Override
public void run() {
if (System.currentTimeMillis() - sendTime >= HEART_BEAT_RATE) {
if (!TextUtils.isEmpty(closeReason)){
// 发送数据
sendData();
sendTime = System.currentTimeMillis();
}
// 发完数据后,然后隔5秒发送心跳包
mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);
}
};
// 发送心跳
private void sendHeart() {
String jsonHead="";
Map<String,Object> mapHead=new HashMap<>();
mapHead.put("heart", "heart") ;
jsonHead=buildRequestParams(mapHead);
//连接成功后给服务器发送心跳包
if (webc != null) {
webc.send(jsonHead);
}
}
// 发送数据
private void sendData() {
String jsonHead="";
Map<String,Object> mapHead=new HashMap<>();
mapHead.put("qrCode", "456789") ;
jsonHead=buildRequestParams(mapHead);
//连接成功后给服务器发送消息
if (webc != null) {
webc.send(jsonHead);
}
}
}