Android程序中使用websocket通信(java-websocket)

使用场景:需要和硬件保持实时通信

为什么用websocket:在以前的消息推送机制中,用的都是http轮询(polling),做一个定时器定时向服务器发送请求,这种方式是非常消耗资源的,因为它本质还是http请求,而且显得非常笨拙。而WebSocket 在浏览器和服务器完成一个握手的动作,在建立连接之后,服务器可以主动传送数据给客户端,客户端也可以随时向服务器发送数据。

1.引入java-websocket

implementation 'org.java-websocket:Java-WebSocket:1.4.0'

2.初始化连接

 /**
     * 初始化websocket连接
     */
    private void initSocketClient() {
        URI uri = URI.create(WSUri);
        client = new JWebSocketClient(uri) {
            //可以获取到一些服务器推送过来的消息
            @Override
            public void onMessage(String message) {
                JSONObject jsonObject = JSON.parseObject(message);
            }

            @Override
            public void onOpen(ServerHandshake handshakedata) {
                super.onOpen(handshakedata);
                Log.e("JWebSocketClientService", "websocket连接成功");
                msgData sn = new msgData();
                sn.setSn(getDeviceSN());
                msg obj = new msg();
                obj.setCommand("init");
                obj.setData(sn);
                String str = JSON.toJSONString(obj);
                Log.e(TAG, "-----" + JSON.toJSONString(obj));
                sendMsg(str);
                heartBeatRunnable.run();

            }

            @Override
            public void onError(Exception ex) {
                super.onError(ex);
                Log.e(TAG, "websocket连接错误:" + ex);
            }

            @Override
            public void onClose(int code, String reason, boolean remote) {
                super.onClose(code, reason, remote);
                Log.e(TAG, "websocket断开连接:·code:" + code + "·reason:" + reason + "·remote:" + remote);
            }
        };
        connect();
    }

3.连接websocket

先判断是否已经连接过了,连接过了什么也不做

/**
     * 连接websocket
     */
    private void connect() {
        if (client.isOpen()) {
            return;
        }
        client.connect();
    }

4.发送消息

我们可以自定义一些消息(msg)发送给服务器

/**
     * 发送消息
     *
     * @param msg
     */
    public void sendMsg(String msg) {
        if (null != client) {
            client.send(msg);
        }
    }

5.重连

由于很多因素甚至是外部因素的影响,可能会导致我们建立的ws连接会断连这个时候我们需要重新连接上服务器

/**
     * 开启重连
     */
    private void reconnectWs() {
        Log.e("", "正在重连");
        initSocketClient();
    }

6.心跳检测

心跳检测是判断有没有断连的重要方法,也能比较严谨的让后台判断硬件的在线状态,通过判断client的状态来决定是否重新建立连接,如下代码,如果判断不是关闭状态,我会发送一些信息给服务器,里边包括硬件的sn编号和一个“ping”的字符串,来告诉后台这台设备还“活着”。

 private static final long HEART_BEAT_RATE = 15 * 1000;//每隔15秒进行一次对长连接的心跳检测
    private Handler mHandler = new Handler();
    //心跳检测
    private Runnable heartBeatRunnable = new Runnable() {
        @Override
        public void run() {
            mHandler.removeCallbacks(heartBeatRunnable);
            if (client != null) {
                if (client.isClosed()) {
                    Log.e(TAG, "关闭状态");
                    reconnectWs();//心跳机制发现断开开启重连
                } else {
                    //发送消息
                    msgData sn = new msgData();
                    sn.setSn(getDeviceSN());
                    msg obj = new msg();
                    obj.setData(sn);
                    if (client.isOpen()) {
                        obj.setCommand("ping");
                        Log.e("", "❤");
                        sendMsg(JSON.toJSONString(obj));
                    } else {
                        Log.e(TAG, "异常");
                        reconnectWs();//心跳机制发现断开开启重连
                    }
                }
            } else {
                Log.e("", "没有初始化");
                //如果client已为空,重新初始化连接
                initSocketClient();
            }
            mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);
        }
    };

你可能感兴趣的:(Android,websocket,websocket,网络协议,网络,android,java)