Android程序中使用websocket通信(java-websocket)

这篇具有很好参考价值的文章主要介绍了Android程序中使用websocket通信(java-websocket)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

使用场景:需要和硬件保持实时通信

为什么用websocket:在以前的消息推送机制中,用的都是http轮询(polling),做一个定时器定时向服务器发送请求,这种方式是非常消耗资源的,因为它本质还是http请求,而且显得非常笨拙。而WebSocket 在浏览器和服务器完成一个握手的动作,在建立连接之后,服务器可以主动传送数据给客户端,客户端也可以随时向服务器发送数据。

1.引入java-websocket

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

2.初始化连接

 /**
     * 初始化websocket连接
     */
    private void initSocketClient() {
        URI uri = URI.create(WSUri);
        client = new JWebSocketClient(uri) {
            //可以获取到一些服务器推送过来的消息
            @Override
            public void onMessage(String message) {
                JSONObject jsonObject = JSON.parseObject(message);
            }

            @Override
            public void onOpen(ServerHandshake handshakedata) {
                super.onOpen(handshakedata);
                Log.e("JWebSocketClientService", "websocket连接成功");
                msgData sn = new msgData();
                sn.setSn(getDeviceSN());
                msg obj = new msg();
                obj.setCommand("init");
                obj.setData(sn);
                String str = JSON.toJSONString(obj);
                Log.e(TAG, "-----" + JSON.toJSONString(obj));
                sendMsg(str);
                heartBeatRunnable.run();

            }

            @Override
            public void onError(Exception ex) {
                super.onError(ex);
                Log.e(TAG, "websocket连接错误:" + ex);
            }

            @Override
            public void onClose(int code, String reason, boolean remote) {
                super.onClose(code, reason, remote);
                Log.e(TAG, "websocket断开连接:·code:" + code + "·reason:" + reason + "·remote:" + remote);
            }
        };
        connect();
    }

3.连接websocket

先判断是否已经连接过了,连接过了什么也不做

/**
     * 连接websocket
     */
    private void connect() {
        if (client.isOpen()) {
            return;
        }
        client.connect();
    }

4.发送消息

我们可以自定义一些消息(msg)发送给服务器

/**
     * 发送消息
     *
     * @param msg
     */
    public void sendMsg(String msg) {
        if (null != client) {
            client.send(msg);
        }
    }

5.重连

由于很多因素甚至是外部因素的影响,可能会导致我们建立的ws连接会断连这个时候我们需要重新连接上服务器

/**
     * 开启重连
     */
    private void reconnectWs() {
        Log.e("", "正在重连");
        initSocketClient();
    }

6.心跳检测

心跳检测是判断有没有断连的重要方法,也能比较严谨的让后台判断硬件的在线状态,通过判断client的状态来决定是否重新建立连接,如下代码,如果判断不是关闭状态,我会发送一些信息给服务器,里边包括硬件的sn编号和一个“ping”的字符串,来告诉后台这台设备还“活着”。文章来源地址https://www.toymoban.com/news/detail-816934.html

 private static final long HEART_BEAT_RATE = 15 * 1000;//每隔15秒进行一次对长连接的心跳检测
    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");
                        Log.e("", "❤");
                        sendMsg(JSON.toJSONString(obj));
                    } else {
                        Log.e(TAG, "异常");
                        reconnectWs();//心跳机制发现断开开启重连
                    }
                }
            } else {
                Log.e("", "没有初始化");
                //如果client已为空,重新初始化连接
                initSocketClient();
            }
            mHandler.postDelayed(heartBeatRunnable, HEART_BEAT_RATE);
        }
    };

到了这里,关于Android程序中使用websocket通信(java-websocket)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android Binder——Java层通信实例(十六)

            前面的文章中我们介绍了 Java 层服务的注册流程,以及代理文件的查找。这里我们看一个 Binder 通信的实例,为了方便我们就以 Android 源码中现有的功能 PMS 的 install 为例,PMS 在进行 APK 安装时,会进行 dex 的翻译,依赖守护进程 installd 完成。         在 Binder

    2024年04月23日
    浏览(55)
  • 小程序基础库与Android之间通信优化的可能

    最近在学习graalvm,发现有一个graaljs项目,项目中介绍可以让java与JavaScript做数据转换,比如JavaScript中可以使用java的数据类型与结构。突然想到之前遇到的一个问题,小程序中开发的代码和基础库的部分代码都是j2v8来执行的,其中的数据通信是通过bridge去做的,其实就是把数

    2024年01月18日
    浏览(37)
  • java中使用sockjs、stomp完成websocket通信

    主要配置 握手拦截(这套方案好像前端无法补充Header,就不在这里做权限校验)这里采用的方法是直接问号拼接token,前端 new SockJS(这里带问号),sockjs使用的是http所以没毛病,本文使用的是OAuth2权限校验 之后可以设置握手之后的身份注入(配置了这个可以在单对单订阅时直接使用) 储

    2024年02月10日
    浏览(36)
  • Android串口开发之使用JNI实现ANDROID和串口通信

    导语:Android串口通信在物联网、智能家居等领域具有广泛的应用。本文将详细介绍如何使用JNI技术实现Android设备与串口的通信,包括串口的打开、设置参数和读写数据等过程。 在开始介绍Android串口开发之前,我们需要了解以下几个概念: JNI:JNI(Java Native Interface)是一种

    2024年02月07日
    浏览(48)
  • android开发使用OkHttp自带的WebSocket实现IM功能

    目录 一、背景 二、在项目中添加依赖包 三、框架调用 1、配置OkHttpClient  2、调用Url,构建WebSocket请求 3、建立连接 4、使用WebSocket对象发送消息     android app开发经常会有IM需求,很多新手不晓得如何入手,难点在于通讯不中断。其实android发展到今天,很多技术都很完善,有

    2024年02月08日
    浏览(40)
  • android studio虚拟机中一个程序模拟udp通信

    分别在两个方法中创建两个线程,一个作为服务器进行监听,一个作为客户端进行数据发送。

    2024年02月07日
    浏览(33)
  • Android Binder通信原理(七):java 下的C-S

    源码基于: Android R 在之前的几篇博文中,对Android binder 的通信原理进行的深入的剖析,这些博文包括: binder 简介 、 servicemanager启动 、 service注册 、 service获取 、 Java 端的service 注册和获 取。 在前一文中,通过实例,详细地说明了 native 下 的C-S 通信原理 。 本文在之前的基

    2024年02月11日
    浏览(40)
  • 使用GoEasy快速实现Android原生app中的websocket消息推送

    摘要: GoEasy带来了一项令开发者振奋的消息:全面支持Android原生平台!现在,您可以在Android应用中使用最酷炫的实时通信功能,借助GoEasy轻松实现消息的发送和接收。本文将带您领略GoEasy最新版本的威力,为您的应用增添一抹鲜活的互动色彩。 嗨,开发者朋友们!是时候展

    2024年02月12日
    浏览(46)
  • Android Binder通信原理(五):Java 端的service 注册和获取

    源码基于: Android R 在阐述相关的知识点,先整理个框架图,后面带着框架图来分析过程: Java 端对于binder 使用大致分为: Java client Java service Java client native service Java 端service 的注册使用 ServiceManager.addService() Java 端service 的获取使用 ServiceManager.getService() 入口都是通过 Servic

    2024年02月11日
    浏览(43)
  • 【Android】串口通信的理论与使用教程

    Android 系统诞生这十几年以来, Android 开发工程师岗位经历了由盛转衰的过程,目前纯UI的Android APP已经鲜有公司愿意花费巨资去开发,Android APP开发的业务也仅剩游戏、物联网(Internet of Things,简称IoT)等方向。在物联网的世界中,串口通信是常见的有线通信方式,本篇文章

    2024年02月12日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包