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

前置条件,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.mzph.cn/news/798787.shtml

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

相关文章

服务器的云备份和快照有哪些区别?

服务器的云备份和快照是两种常见的数据保护和恢复机制,它们有一些区别: 1. 云备份: 定义:云备份是将服务器上的数据定期备份到云存储中,以保护数据免受意外删除、数据损坏、病毒感染等风险。 特点: 备份数据…

Android 13 aosp hiddenapi config

Android 11 hiddenapi路径 frameworks/base/config/hiddenapi-greylist-packages.txtAndroid 13 hiddenapi路径 frameworks/base/boot/hiddenapi/hiddenapi-unsupported-packages.txt

c++STL list 简单模拟实现

分享一份cstl库list简单模拟实现。 如果能帮到你的话请点个免费的赞吧&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; ​ #pragma once #include<assert.h>namespace my_list {template<class T>class ListNode {typedef ListNode<T> Node…

uniApp移动端安卓中使用webview打开pdf文件是下载而不是预览解决方案

关键 使用到 pdf.js 第一步&#xff1a; 下载pdf.js 文件到项目根目录 也就是这个文件 附下载地址&#xff1a;uni-app-pdf: 在uni-app中使用pdf.js实现在手机上打开pdf 也可通过其他方法下载 如npm 第二步&#xff1a; 拷贝hybrid文件到项目根目录 第三步&#xff1a;…

HarmonyOS实战开发-通过screenshot模块实现屏幕截图 。

介绍 本示例展示全屏截图和屏幕局部截图。 本示例通过screenshot模块实现屏幕截图 &#xff0c;通过window模块实现隐私窗口切换&#xff0c;通过display模块查询当前隐私窗口。 效果预览 使用说明&#xff1a; 点击右上角图标打开弹窗&#xff0c;选择截屏&#xff0c;展示…

AI智能电销机器人获客的方法

随着计算机和AI技术的发展&#xff0c;普通的电话营销已经逐步脱离人工操作的方法&#xff0c;转向电脑智能拨打。很多电销智能机器人已经达到让客户分辨不出真假人工的效果&#xff0c;电销智能机器人的获客价值有哪些&#xff1f;电销智能机器人的获客渠道包括哪些&#xff1…

stable-diffusion-webui安装教程

现在AI开始进入绘画领域,并且能自动根据文本来创建图片出来,这是一个划时代的进步。 这时候,我也不能落后,要紧跟上时代的步伐,那么也来学习一下stable-diffusion的使用,这样也算多一项对技术的认识,提高对AI的认知。 从网上看到很多stable-diffusion-webui的安装,其…

为什么苹果 Mac 电脑需要使用清理软件?

尽管 Apple Mac 电脑因其卓越的性能、简洁高效的 macOS 操作系统及独特的美学设计备受全球用户青睐&#xff0c;但任何电子设备在长期使用后都难以避免面临系统资源日渐累积的问题。其中一个重要维护需求在于&#xff0c;随着使用时间的增长&#xff0c;Mac电脑可能会由于系统垃…

element-ui 在Popover弹框中使用Select选择器,Vue3

bug描述&#xff1a; 当选择完select的时候,popover也会退出。 解决&#xff1a; popover组件的的关闭是当点击组件外的元素时会关闭&#xff0c;select虽然是写在组件内的&#xff0c;但是select有一个默认属性teleported“true” 会把它默认插到 body 元素&#xff0c;我…

html表单1:表单基础

表单 网页中的一个交互区域 form表单标签属性 action:选择将表单传递给谁处理 target:选择跳到那个页面(_self/_blank…) method:选择请求方式 input输入控件 type"text"表示为输入框 ,name属性中传入接收方规定的参数 value代表输入框中的默认值 maxlength…

强行让Java和Go对比一波[持续更新]

概述 很多Java开发如果想转Golang的话&#xff0c;比较让Java开发蛋疼的第一是语法&#xff0c;第二是一些思想和设计哲学的Gap&#xff0c;所以我这儿强行整理一波Java和Golang的对比&#xff0c;但是由于GO和Java在很多方面都有不同的设计&#xff0c;所以这些对比的项可以更…

Docker容器(五)Docker Compose

一、概述 1.1介绍 Docker Compose是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。Compose 是 Docker 公司推出的一个工具软件&#xff0c;可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml&#xff0c;…

分布式主键ID生成策略

业务系统对分布式ID的要求 唯一性&#xff1a;在分布式系统中&#xff0c;每个节点都需要生成唯一的标识符来确保数据的唯一性。传统的单点生成ID方式无法满足分布式环境下的需求&#xff0c;而分布式ID能够在整个系统中保证每个节点生成的ID都是唯一的。 顺序性&#xff1a;某…

【Android】一文总结Android的init语言

&#x1f53a;导读&#xff1a; 1、在Android系统中&#xff0c;存在多个以xxx.rc形式命名的文件&#xff0c;这些文件可以理解成Android系统配置文件&#xff0c;在Android系统启动过程中&#xff0c;由init进程加载并解析&#xff0c;这些文件中的内容形成了Android的init语言…

hadoop streaming及hadoop官方文档

由于hadoop的map reduce框架计算性能已经比较老旧&#xff0c;有很多新的框架性能有很大提升&#xff0c;已经很少有基于相关api进行开发的项目&#xff0c;但hadoop streaming工具能帮助开发者兼容任何语言地运行自己的分布式程序&#xff0c;下面来简单介绍。 官方api文档地…

【C++】vector 释放,二维vector开辟 使用

文章目录 vector容器的内存释放释放方法 使用vector开辟一个二维数组开辟一段已知大小的二维vector使用一段已经开辟的二维vector开辟一段未知大小的二维vector vector容器的内存释放 首先对于数据量较小的vector容器&#xff0c;没有太多必要自己进行主动释放&#xff0c;小容…

Svg Flow Editor 原生svg流程图编辑器(五)

系列文章 Svg Flow Editor 原生svg流程图编辑器&#xff08;一&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;二&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;三&#xff09; Svg Flow Editor 原生svg流程图编辑器&#xff08;四&#xf…

使用tomcat里的API - servlet 写动态网页

一、创建一个新的Maven空项目 首次创建maven项目的时候&#xff0c;会自动从maven网站上下载一些依赖组件&#xff08;这个过程需要保证网络稳定&#xff0c;否则后续打包一些操作会出现一些问题&#xff09; ps:校园网可能会屏蔽一些网站&#xff0c;可能会导致maven的依赖…

FPGA + 图像处理(三)生成3x3像素矩阵

前言 生成NxN的像素矩阵是对图像进行各类滤波操作的基本前提&#xff0c;本文介绍一种通过bram生成3x3矩阵的方法。 程序 生成bram核 因为本文介绍的是基于bram生成的3x3像素矩阵&#xff0c;所以要先生成两个bram核&#xff0c;用于缓存前两行图像数据 在 IP catalog中选…

刷代码随想录有感(24)

有时候我会怀疑努力的意义&#xff0c;因为我总是花人家好几倍的时间去理解一个狗看了都觉得弱智的问题&#xff0c;思考过后我知道&#xff0c;努力本没有意义&#xff0c;是在未来可能十年内取得成就时突然回想起来之前做过一些事情&#xff0c;未来的成就赋予曾经的意义&…