/**
* websocket的心跳连接 的服务
*/
public class Socket_BackService extends Service {
public static final String data = "jsondata";//接收广播的标示
public static final String data_agin = "jsondata_agin";//接收广播的标示
private long sendTime = 0L;
// 发送心跳包
private Handler mHandler = new Handler();
private Runnable heartBeatRunnable = new Runnable() {
@Override
public void run() {
//获取系统当前时间 减去上次发送的时间 大于15秒就发送 一次请求
if (System.currentTimeMillis() - sendTime >= HEART_BEAT_RATE) {
if (!Utils.isEmpty(mWebSocket + "")) {
//发送一个空消息给服务器,通过发送消息的成功失败来判断长连接的连接状态
boolean isSuccess = mWebSocket.send("长链接在活着");
//发送失败,则长连接已断开,
if (!isSuccess) {
//取消掉以前的长连接,和 heartBeatRunnable
mHandler.removeCallbacks(heartBeatRunnable);
mWebSocket.cancel();
new InitSocketThread().start();//创建一个新的连接
Log.e("长链接异常", "尝试再次接连");
} else {
//长连接处于连接状态
Log.e("长链接正常", "1111111");
}
//记录上次发送的时间
sendTime = System.currentTimeMillis();
}
}
//每隔一定的时间,对长连接进行一次心跳检测
mHandler.postDelayed(this, HEART_BEAT_RATE);
}
};
@Override
public void onCreate() {
super.onCreate();
//开启socket线程
new InitSocketThread().start();
}
//开启线程
class InitSocketThread extends Thread {
@Override
public void run() {
super.run();
try {
//初始化socket 链接
initSocket();
} catch (UnknownHostException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 心跳检测时间
*/
private static final long HEART_BEAT_RATE = 15 * 1000;//每隔10秒进行一次对长连接的心跳检测
private WebSocket mWebSocket;
// 初始化socket
private void initSocket() throws UnknownHostException, IOException {
OkHttpClient client = new OkHttpClient.Builder().readTimeout(0, TimeUnit.MILLISECONDS).build();
//判断拼接的参数是不是空的
if ((!Utils.isEmpty(UserData.getUserId(this) + "")) && (!Utils.isEmpty(UserData.get_tis_id(this) + ""))) {
//拼接socket地址 和需要的参数
Request request = new Request.Builder().url("这里放端口前缀/" + "?uid=" + UserData.getUserId(this) + "&group=" + UserData.get_tis_id(this)).build();
client.newWebSocket(request, new WebSocketListener() {
@Override
public void onOpen(WebSocket webSocket, Response response) {//开启长连接成功的回调
super.onOpen(webSocket, response);
mWebSocket = webSocket;
Log.e("长链接连接成功", "00000000000000000000");
}
@Override
public void onMessage(WebSocket webSocket, String text) {//接收消息的回调
super.onMessage(webSocket, text);
//收到服务器端传过来的消息text
//接收信息,发送广播 刷新ui
Intent intent = new Intent();
intent.setAction(data);
intent.putExtra("json", text);
sendBroadcast(intent);
}
@Override
public void onMessage(WebSocket webSocket, ByteString bytes) {
super.onMessage(webSocket, bytes);
}
@Override
public void onClosing(WebSocket webSocket, int code, String reason) {
super.onClosing(webSocket, code, reason);
}
@Override
public void onClosed(WebSocket webSocket, int code, String reason) {
super.onClosed(webSocket, code, reason);
}
@Override
public void onFailure(WebSocket webSocket, Throwable t, @Nullable Response response) {//长连接连接失败的回调
super.onFailure(webSocket, t, response);
}
});
client.dispatcher().executorService().shutdown();
//延迟15秒检查 socket链接
mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);//开启心跳检测
}
}
@Override
public void onDestroy() {
super.onDestroy();
// 关闭socket 和heartBeatRunnable
if (mWebSocket != null) {
mWebSocket.close(1000, null);
mHandler.removeCallbacks(heartBeatRunnable);
}
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
}
用法
//开启心跳的服务
private Intent socketservice; socketservice = new Intent(Activity_ZhiBoRoom.this, Socket_BackService.class); startService(socketservice);