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

news/2024/4/30 2:33:31/文章来源:https://blog.csdn.net/m0_49083276/article/details/137453846

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

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

封装websocket类:

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) {@Overridepublic void onMessage(String message) {handleMessage(message);}@Overridepublic 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();}@Overridepublic void onError(Exception ex) {super.onError(ex);Log.e(TAG,"websocket连接错误:" + ex);ping_status = false;}@Overridepublic 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() {@Overridepublic 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);}}}

定义回调接口 :

public interface ActivityWsCallback {void onMessageReceived(String message);
}

使用:

public class YourActivity implements ActivityWsCallback {private WsHelper wsHelper;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 初始化 WsHelperwsHelper = new WsHelper();wsHelper.initSocketClient();// 设置回调wsHelper.setCallback(this);}// 实现回调接口的方法,处理收到的消息@Overridepublic void onMessageReceived(String message) {// 在这里处理收到的消息Log.d(TAG, "Received message: " + message);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_1046117.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux云计算之Linux基础3——Linux系统基础2

1、终端 终端(terminal):人和系统交互的必要设备,人机交互最后一个界面(包含独立的输入输出设备) 物理终端(console):直接接入本机器的键盘设备和显示器虚拟终端(tty):通过软件方式虚拟实现的终端。它可以…

【LeetCode】手撕系列—92. 反转链表 II

目录 1-思路2-题解⭐反转链表 II——题解思路 3-ACM模式 原题链接:92. 反转链表 II 1-思路 先定义一个 dummyHead定义三个指针 **pre**:定位到需要被翻转的区间的前一个元素,实现头插**cur**:定位到当前需要被翻转的元素**next**…

【鹅厂摸鱼日记(二)】(生活篇)初到深圳的人情冷暖

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:重生之我在鹅厂摸鱼⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多知识   🔝🔝 摸鱼日记 1. 前言2. 鹅厂的人文关怀…

Java | Leetcode Java题解之第20题有效的括号

题目&#xff1a; 题解&#xff1a; class Solution {public boolean isValid(String s) {int n s.length();if (n % 2 1) {return false;}Map<Character, Character> pairs new HashMap<Character, Character>() {{put(), ();put(], [);put(}, {);}};Deque<…

UDP实现Mini版在线聊天室

实现原理 只有当客户端先对服务器发送online消息的时候&#xff0c;服务器才会把客户端加入到在线列表。当在线列表的用户发消息的时候&#xff0c;服务器会把消息广播给在线列表中的所有用户。而当用户输入offline时&#xff0c;表明自己要下线了&#xff0c;此时服务器把该用…

MQ死信队列

面试题&#xff1a;你们是如何保证消息不丢失的&#xff1f; 1、什么是死信 在 RabbitMQ 中充当主角的就是消息&#xff0c;在不同场景下&#xff0c;消息会有不同地表现。 死信就是消息在特定场景下的一种表现形式&#xff0c;这些场景包括&#xff1a; 1. 消息被拒绝访问&…

Canal--->准备MySql主数据库---->安装canal

一、安装主数据库 1.在服务器新建文件夹 mysql/data&#xff0c;新建文件 mysql/conf.d/my.cnf 其中my.cnf 内容如下 [mysqld] log_timestampsSYSTEM default-time-zone8:00 server-id1 log-binmysql-bin binlog-do-db mall # 要监听的库 binlog_formatROW2.启动数据库 do…

数据库相关知识总结

一、数据库三级模式 三个抽象层次&#xff1a; 1. 视图层&#xff1a;最高层次的抽象&#xff0c;描述整个数据库的某个部分的数据 2. 逻辑层&#xff1a;描述数据库中存储的数据以及这些数据存在的关联 3. 物理层&#xff1a;最低层次的抽象&#xff0c;描述数据在存储器中时如…

Vue3 使用ElementUI 显示异常

element提供的样例不能正常显示&#xff0c;需要进行配置 1.npm install element-plus --save 2.main.js // main.ts import { createApp } from vue import ElementPlus from element-plus //全局引入 import element-plus/dist/index.css import App from ./App.vue const …

IOS手机耗电量测试

1. 耗电量原始测试方法 1.1 方法原理&#xff1a; 根据iPhone手机右上角的电池百分比变化来计算耗电量。 1.2实际操作&#xff1a; 在iOS通用设置中打开电池百分比数值显示&#xff0c;然后操作30分钟&#xff0c;60分钟&#xff0c;90分钟&#xff0c;看开始时和结束时电池…

漫画合集 下载教程

https://pan.xunlei.com/s/VNv9c-Bl3KF0Ir94-IdN4jfOA1?pwdfrwi# 复制打开

javaScript 事件循环 Event Loop

一、前言 javaScript 是单线程的编程语言&#xff0c;只能同一时间内做一件事情&#xff0c;按照顺序来处理事件&#xff0c;但是在遇到异步事件的时候&#xff0c;js线程并没有阻塞&#xff0c;还会继续执行&#xff0c;这又是为什么呢&#xff1f; 二、基础知识 堆&#x…

FPGA开源项目分享——基于 DE1-SOC 的 String Art 实现

导语 今天继续康奈尔大学FPGA课程ECE 5760的典型案例分享——基于DE1-SOC的String Art实现。 &#xff08;更多其他案例请参考网站&#xff1a; Final Projects ECE 5760&#xff09; 1. 项目概述 项目网址 ECE 5760 Final Project 项目说明 String Art起源于19世纪的数学…

【第十二篇】使用BurpSuite实现CSRF(实战案例)

CSRF存在前提:简单的身份验证只能保证请求是发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的 业务场景:新增、删除、收藏、编辑、保存使用Burp发现CSRF漏洞的过程如下。 1、如图,存在修改邮箱的功能点如下: 2、修改邮箱的流量包,此时邮箱已被修改: 思路:是…

白盒测试-条件覆盖

​ 条件覆盖是指运行代码进行测试时&#xff0c;程序中所有判断语句中的条件取值为真值为假的情况都被覆盖到&#xff0c;即每个判断语句的所有条件取真值和假值的情况都至少被经历过一次。 ​ 条件覆盖率的计算方法为&#xff1a;测试时覆盖到的条件语句真、假情况的总数 / 程…

Redis群集模式和rsync远程同步

一、Redis群集模式 1.1 概念 1.2 作用 1.2.1 Redis集群的数据分片 1.2.2 Redis集群的主从复制模型 1.3 搭建Redis 群集模式 1.3.1 开启群集功能 1.3.2 启动redis节点 1.3.3 启动集群 1.3.4 测试群集 二、rsync远程同步 2.1 概念 2.2 同步方式 2.3 备份的方式 2.4…

机器学习实现文本分类

传统的向量空间模型&#xff08;VSM&#xff09;假设特征项之间相互独立&#xff0c;这与实际情况是不相符的&#xff0c;为了解决这个问题&#xff0c;可以采用文本的分布式表示方式(例如 word embedding形式)&#xff0c;通过文本的分布式表示&#xff0c;把文本表示成类似图…

C语言面试题之合法二叉搜索树

合法二叉搜索树 实例要求 实现一个函数&#xff0c;检查一棵二叉树是否为二叉搜索树&#xff1b; 示例 1: 输入:2/ \1 3 输出: true 示例 2: 输入:5/ \1 4/ \3 6 输出: false 解释: 输入为: [5,1,4,null,null,3,6]。根节点的值为 5 &#xff0c;但是其右子节点值为 4 …

《QT实用小工具·十七》密钥生成工具

1、概述 源码放在文章末尾 该项目主要用于生成密钥&#xff0c;下面是demo演示&#xff1a; 项目部分代码如下&#xff1a; #pragma execution_character_set("utf-8")#include "frmmain.h" #include "ui_frmmain.h" #include "qmessag…

最新安卓iOS免签封装源码 可处理apk报毒

资源简介 解决app误报毒 可打包APP可上传APK 自动实现5分钟随机更换包名和签名系统源码 本程序功能介绍 程序可实现域名自动打包成app 出现误报毒并自动更换包名和签名时间一次 也可以上传打包好的apk*时间自动更换包名和签名 自动覆盖原下载路径&#xff0c;下载地址不变…