socket连接

/**
 * 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值