基于Android封装Java-WebSocket,开箱即食

前置条件,build.gradle引入依赖:

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

封装websocket类:

java 复制代码
public class WsHelper {
    private static Option option = new Option();
    public JWebSocketClient client;
    public Boolean ping_status = false;
    private ActivityWsCallback callback;
    private String TAG = "WS";
    public void setCallback(ActivityWsCallback callback) {
        this.callback = callback;
    }

    /**
     * 初始化websocket连接
     */
    public void initSocketClient() {
        URI uri = URI.create(option.WSUri);
        Logger.e("开始ws连接");
        client = new JWebSocketClient(uri) {
            @Override
            public void onMessage(String message) {
                handleMessage(message);

            }

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

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

            @Override
            public void onClose(int code, String reason, boolean remote) {
                super.onClose(code, reason, remote);
                Log.e("ws", "websocket断开连接:·code:" + code + "·reason:" + reason + "·remote:" + remote);
                ping_status = false;
            }
        };
        connect();
    }
    //消息发送
    public void sendMsg(String msg) {
        if (null != client && client.isOpen()) {
            client.send(msg);
        } else {
            ping_status = false;
        }
    }
    /**
     * 连接websocket
     */
    private void connect() {
        if (client.isOpen()) {
            return;
        }
        client.connect();
    }

    //心跳检测
    private static final long HEART_BEAT_RATE = 5 * 1000;
    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");
                        sendMsg(JSON.toJSONString(obj));
                    } else {
                        Log.e(TAG, "异常");
                        ping_status = false;
                        reconnectWs();//心跳机制发现断开开启重连
                    }
                }
            } else {
                Log.e("", "没有初始化");
                //如果client已为空,重新初始化连接
                initSocketClient();
            }
            mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);
        }
    };

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

    public static String getDeviceSN() {
        String serialNumber = android.os.Build.SERIAL;
        return serialNumber;
    }

    public class msg {
        private String command;
        private msgData data;

        public msgData getData() {
            return data;
        }

        public String getCommand() {
            return command;
        }

        public void setCommand(String command) {
            this.command = command;
        }

        public void setData(msgData data) {
            this.data = data;
        }
    }
    public class msgData {
        private String sn;
        private String data;

        public void setData(String data) {
            this.sn = data;
        }

        public String getSn() {
            return sn;
        }

        public void setSn(String sn) {
            this.sn = sn;
        }
    }

    /**
     * 处理收到的消息
     * @param message 收到的消息
     */
    private void handleMessage(String message) {
        // 调用回调接口的方法,将消息传递给调用方
        if (callback != null) {
            callback.onMessageReceived(message);
        }
    }

}

定义回调接口 :

java 复制代码
public interface ActivityWsCallback {
    void onMessageReceived(String message);
}

使用:

java 复制代码
public class YourActivity implements ActivityWsCallback {

    private WsHelper wsHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 初始化 WsHelper
        wsHelper = new WsHelper();
        wsHelper.initSocketClient();

        // 设置回调
        wsHelper.setCallback(this);
    }

    // 实现回调接口的方法,处理收到的消息
    @Override
    public void onMessageReceived(String message) {
        // 在这里处理收到的消息
        Log.d(TAG, "Received message: " + message);
    }
}
相关推荐
轩轩曲觞阁16 分钟前
Linux网络——网络初识
linux·网络
摘星星ʕ•̫͡•ʔ19 分钟前
计算机网络 第二章:物理层
网络·计算机网络
linnux领域21 分钟前
使用ensp配置单臂路由、静态路由,实现PC互相通信。
网络
hgdlip25 分钟前
本机ip地址和网络ip地址一样吗
网络·网络协议·tcp/ip·网络ip地址·本机ip地址
EasyCVR36 分钟前
ISUP协议视频平台EasyCVR视频设备轨迹回放平台智慧农业视频远程监控管理方案
服务器·网络·数据库·音视频
长安11085 小时前
前后端、网关、协议方面补充
网络
hzyyyyyyyu8 小时前
隧道技术-tcp封装icmp出网
网络·网络协议·tcp/ip
南猿北者8 小时前
docker Network(网络)
网络·docker·容器
Hacker_Nightrain9 小时前
网络安全CTF比赛规则
网络·安全·web安全
网络安全指导员10 小时前
恶意PDF文档分析记录
网络·安全·web安全·pdf