基于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);
    }
}
相关推荐
武汉誉天18 分钟前
学云计算还是网络,选哪个好?
网络·云计算
Johny_Zhao2 小时前
Linux防止rm误操作防护方案
linux·网络·人工智能·网络安全·信息安全·云计算·yum源·系统运维
心一信息3 小时前
如何通过华为无线控制器添加一个名为yunwei的无线网络
运维·网络·华为
废喵喵呜4 小时前
达梦数据库-实时主备集群部署详解(附图文)手工搭建一主一备数据守护集群DW
网络·数据库·tcp/ip
Sadsvit6 小时前
网络聚合链路与软件网桥配置指南
linux·运维·服务器·网络·centos
派拉软件9 小时前
微软AD国产化替换倒计时——不是选择题,而是生存题
网络·安全·microsoft·目录管理·微软ad替换·身份与访问控制管理iam
mysla9 小时前
嵌入式学习day34-网络-tcp/udp
服务器·网络·学习
成富9 小时前
MCP 传输方式,stdio、HTTP SSE 和 Streamable HTTP
网络·网络协议·http
扶尔魔ocy9 小时前
【QT入门到晋级】进程间通信(IPC)-socket(包含性能优化案例)
网络
卓码软件测评10 小时前
软件测试:如何利用Burp Suite进行高效WEB安全测试
网络·安全·web安全·可用性测试·安全性测试