基于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);
    }
}
相关推荐
hrrrrb2 小时前
【TCP/IP】12. 文件传输协议
服务器·网络·tcp/ip
quant_19863 小时前
R语言如何接入实时行情接口
开发语言·经验分享·笔记·python·websocket·金融·r语言
网安小白的进阶之路5 小时前
A模块 系统与网络安全 第四门课 弹性交换网络-2
网络·安全·web安全·系统安全·交换机
安全系统学习5 小时前
网络安全之RCE分析与利用详情
服务器·网络·安全·web安全·系统安全
武汉唯众智创5 小时前
网络安全实训室建设方案全攻略
网络·安全·web安全·网络安全·网络安全实训室·网络安全实验室
啟明起鸣6 小时前
【网络编程】简易的 p2p 模型,实现两台虚拟机之间的简单点对点通信,并以小见大观察 TCP 协议的具体运行
c语言·网络·tcp/ip·p2p
追烽少年x6 小时前
设计模式---观察者模式(发布-订阅模式)
网络·设计模式
宝山哥哥8 小时前
网络信息安全学习笔记1----------网络信息安全概述
网络·笔记·学习·安全·网络安全
专注VB编程开发20年8 小时前
常见 HTTP 方法的成功状态码200,204,202,201
开发语言·网络协议·tcp/ip·http
Dsocc9 小时前
TCP 动态选路协议全面研究:OSPF、BGP 与 IS-IS 的比较与应用分析
网络·网络协议·tcp/ip