基于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);
    }
}
相关推荐
ZachOn1y1 分钟前
计算机网络:计算机网络概述 —— 初识计算机网络
网络·计算机网络·知识点汇总·考研必备
三金1213830 分钟前
SpringIoC容器的初识
网络·网络协议·rpc
狼头长啸李树身1 小时前
眼儿媚·秋雨绵绵窗暗暗
大数据·网络·服务发现·媒体
SizeTheMoment2 小时前
初识HTTP协议
网络·网络协议·http
哲伦贼稳妥3 小时前
一天认识一个硬件之机房地板
运维·网络·经验分享·其他
hgdlip4 小时前
如何快速切换电脑的ip地址
网络·tcp/ip·电脑
程序员-珍6 小时前
虚拟机ip突然看不了了
linux·网络·网络协议·tcp/ip·centos
4647的码农历程7 小时前
Linux网络编程 -- 网络基础
linux·运维·网络
向李神看齐7 小时前
RTSP协议讲解
网络
Death2007 小时前
使用Qt进行TCP和UDP网络编程
网络·c++·qt·tcp/ip