赞
踩
使用场景:需要和硬件保持实时通信
为什么用websocket:在以前的消息推送机制中,用的都是http轮询(polling),做一个定时器定时向服务器发送请求,这种方式是非常消耗资源的,因为它本质还是http请求,而且显得非常笨拙。而WebSocket 在浏览器和服务器完成一个握手的动作,在建立连接之后,服务器可以主动传送数据给客户端,客户端也可以随时向服务器发送数据。
implementation 'org.java-websocket:Java-WebSocket:1.4.0'
- /**
- * 初始化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();
- }
先判断是否已经连接过了,连接过了什么也不做
- /**
- * 连接websocket
- */
- private void connect() {
- if (client.isOpen()) {
- return;
- }
- client.connect();
- }
我们可以自定义一些消息(msg)发送给服务器
- /**
- * 发送消息
- *
- * @param msg
- */
- public void sendMsg(String msg) {
- if (null != client) {
- client.send(msg);
- }
- }
由于很多因素甚至是外部因素的影响,可能会导致我们建立的ws连接会断连这个时候我们需要重新连接上服务器
- /**
- * 开启重连
- */
- private void reconnectWs() {
- Log.e("", "正在重连");
- initSocketClient();
- }
心跳检测是判断有没有断连的重要方法,也能比较严谨的让后台判断硬件的在线状态,通过判断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);
- }
- };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。