在 Android 应用程序中实现与WebSocket 服务器的实时通信

news2025/1/15 8:31:03

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

通过 OKHttp 请求库实现,在 OKhttp 中,通过 Websocket 类支持 WebSocket 通信。
总共分为以下几步:

  1. 添加依赖

    dependencies {
    	implementation 'com.squareup.okhttp3:okhttp:4.9.0'
    }
    
  2. 添加权限

     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.INTERNET" />
    
  3. 创建 OKHttpClient 对象
    新建 java 文件,名为 myWebSocketClient,并创建OKHttpClient对象

    OkHttpClient client = new OkHttpClient();
    
  4. 创建请求,并输入websocket地址

    Request request = new Request.Builder().url("ws://100.100.34.115:8000").build();
    
  5. 添加 WebSocketListener 监听

    WebSocketListener listener = new WebSocketListener() {
          //@NonNull Response response)
          @Override
          public void onOpen(WebSocket webSocket, Response response) {
              super.onOpen(webSocket, response);
              webSocket.send("我是Android端,我连接成功啦");
              webSocket.send("我是Android端,我要开始发送设备信息啦");
    
              handler = new Handler(Looper.getMainLooper());
              handler.post(new Runnable() {
                  @Override
                  public void run() {
                      ToastUtils.showConnectionError(mContext);
                  }
              });
    
              //连接成功时的处理
              deviceInfoUtils = new DeviceInfoUtils();
              deviceInfoJson = deviceInfoUtils.getDeviceInformationAsJson();
    
              // 发送设备信息给服务器
              webSocket.send(deviceInfoJson);
          }
    
          @Override
          public void onMessage(WebSocket webSocket, String text) {
              super.onMessage(webSocket, text);
              // 接收到消息时的处理
          }
          @Override
          public void onClosed(WebSocket webSocket, int code, String reason) {
              super.onClosed(webSocket, code, reason);
              // 连接关闭时的处理
          }
          @Override
          public void onFailure(WebSocket webSocket, Throwable t, Response response) {
              super.onFailure(webSocket, t, response);
              Log.e("WebSocket","连接失败" +t.getMessage());
              handler = new Handler(Looper.getMainLooper());
              handler.post(new Runnable() {
                  @Override
                  public void run() {
                      Toast.makeText(mContext, "连接WebSocket失败", Toast.LENGTH_SHORT).show();
                  }
              });
    
              if(!isReconnecting) {
                  isReconnecting = true;
                  handler.postDelayed(new Runnable() {
                      @Override
                      public void run() {
                          connectWebSocket();
                          Log.i("重连","正在重连请稍后");
                          Toast.makeText(mContext, "正在重连,请稍后", Toast.LENGTH_SHORT).show();
                          isReconnecting = false;
                      }
                  },5000);
              }
          }
      };
      webSocket = client.newWebSocket(request, listener);
    
  6. 关闭连接逻辑

    public void disconnectWebSocket() {
       if (webSocket != null) {
           webSocket.cancel();
       }
    }
    
  7. 在合适的地方调用 WebSocketClient
    我是在MainActivity.java文件中的onCreate()方法中使用。因为我是逻辑需要,所以创建了一个myWebSocketClient构造方式,当然你们也可以省略。

    context = getApplicationContext();
    	myWebSocketClient = new myWebSocketClient(context);
    	myWebSocketClient.connectWebSocket();
    

在这里插入图片描述

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

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

相关文章

spring-boot学习(2)

上次学习截止到拦截器 1.构建RESfun服务 PathVariable通过url路径获取url传递过来的信息 2.MyBatisPlus 第三行的mydb要改为自己的数据库名 第四&#xff0c;五行的账号密码改成自己的 MaooerScan告诉项目自己的这个MyBatisPlus是使用在哪里的&#xff0c;包名 实体类的定义…

PL/SQL Developer15和Oracle Instant Client安装配置详细图文教程

一、下载介质 1、Oracle Instant Client Oracle Instant Client Downloads | Oracle 中国 2、PL/SQL DEVELOPER PL/SQL Developer - Allround Automations Free trial - Allround Automations 二、安装介质。 1、安装plsqldev1504x64.msi。 一路默认下一步。 选择输入许可信…

实跑 YOLO V11在 OAK内部运行的效果

哈喽&#xff0c;各位OAK中国的朋友们! 大家好我是张伯生 今天&#xff0c;我想给大家演示一下最新发布的Yolo V11神经网络 下面我将演示的一个程序是&#xff1a;同时在我们的OAK相机上跑Yolo V11和RGB-D&#xff0c;也就是彩色相机和深度图的一个叠加的一个效果 RGB-D和Yo…

java_for循环

基本语法 for 关键字&#xff0c;表示循环控制for 有四要素: (1)循环变量初始化(2)循环条件(3)循环操作(4)循环变量迭代循环操作 , 这里可以有多条语句&#xff0c;也就是我们要循环执行的代码如果 循环操作(语句) 只有一条语句&#xff0c;可以省略 {}, 建议不要省略 流程图 …

电气学习知识点

文章目录 NPN和PNP输出 NPN和PNP输出 NPN和PNP&#xff08;两种不同类型的三极管&#xff09;都是集电极输出。&#xff08;集电极开路输出&#xff09; 下图b:基极、c集电极、e发射极 NPN示意图&#xff08;集电极连接负载 — 正方形&#xff09; NPN的电流流向是从集电极…

Elasticsearch设置 X-Pack认证,设置账号和密码

前言 以下Elasticsearch版本&#xff1a;7.9.3 ES自带的X-Pack密码验证&#xff1a; X-Pack是elasticsearch的一个扩展包&#xff0c;将安全&#xff0c;警告&#xff0c;监视&#xff0c;图形和报告功能捆绑在一个易于安装的软件包中&#xff0c;所以我们想要开启账号密码验证…

Scala入门基础(10.1)高阶函数2

一.reduce 二.reduceLeft-reduceRight 三.flod 四.sorter函数 五.sortWith 一.reduce 作用&#xff1a;reduce是一种集合操作&#xff0c;用于对集合中的元素进行聚合操作&#xff0c;返回一个单一的结果。它通过指定的二元操作(即取两个元素进行操作)对集合中的所有元素进…

力扣刷题-算法基础

hello各位小伙伴们,为了进行算法的学习,小编特意新开一个专题来讲解一些算法题 1.移除元素. - 力扣(LeetCode) 本题大概意思是给定一个数组和一个数val删除与val相同的元素,不要改变剩余元素的顺序,最后返回剩余元素的个数。 我们在这里使用双指针,这里的双指针并不是…

npm 加速,命令行修改国内镜像源【附带国内最新几个镜像】超简约版~

为什么要配置国内镜像源&#xff1f; npm 的官方源服务器在国外&#xff0c;对于国内开发者来说&#xff0c;下载速度可能会比较慢&#xff0c;甚至可能会出现下载失败的情况。而国内的镜像源服务器通常会对官方源的包进行同步&#xff0c;并且在国内部署&#xff0c;这样可以…

使用OneAPI+Ollama+Dify搭建一个兼容OpenAI的API发布及AI应用开发系统(三)Dify的安装及配置

在GitHub中的AI工作流短代码平台中&#xff0c;Dify获星一直名列前茅&#xff0c;目前已达48K星&#xff0c;其工作稳定性也是非常的高&#xff0c;在这里我们介绍一下Dify的安装。 由于Dify的结构非常的复杂&#xff0c;我们这里介绍Docker的方式进行安装&#xff0c;硬件的最…

Oracle+11g+笔记(7)-数据库空间管理

Oracle11g笔记(7)-数据库空间管理 7、数据库空间管理 存储空间是数据库系统中非常重要的资源&#xff0c;无论是数据库中的对象还是数据库中的数据都需要空间进行存储&#xff0c;一旦 数据库空间被全部占用&#xff0c;那么该数据库系统就不能再接受任何对象和数据&#xf…

浙大数据结构:09-排序2 Insert or Merge

这道题我们采用先判断是不是insert如果不是再用merge算一下 机翻 1、条件准备 首先存元素个数n&#xff0c;然后oldnum存原始数组&#xff0c;newnum存新数组 #include <iostream> #include<vector> #include<algorithm> using namespace std; #define e…

SSD | (三)NAND闪存(上)

文章目录 &#x1f4da;闪存基本原理&#x1f407;存储单元及相关操作&#x1f407;闪存类型&#x1f407;闪存组织结构&#x1f407;擦、写、读操作&#x1f407;阈值电压分布图 &#x1f4da;闪存基本原理 &#x1f407;存储单元及相关操作 闪存是一种非易失性存储器&#x…

ArkTS中的几个易错问题

问题1&#xff1a;copyWithin的乱用问题 由于鸿蒙开发者很多可能是安卓转的&#xff0c;在安卓侧尤其是kotlin写手觉得copyOfRange很好用&#xff0c;复制数组的某一段数据就用copyOfRange&#xff0c;而copyWithin其实不是同等作用。 下面是AI对copyWithin的解释&#xff1a…

SpringBoot教程(三十二) | SpringBoot集成Skywalking链路跟踪

SpringBoot教程&#xff08;三十二&#xff09; | SpringBoot集成Skywalking链路跟踪 Skywalking是什么&#xff1f;Skywalking与JDK版本的对应关系Skywalking下载Skywalking 数据存储Skywalking 的启动部署探针方式一&#xff1a;IDEA 部署探针方式二&#xff1a;Java 命令行启…

101 - Lecture 7

回顾冯诺依曼模型&#xff08;von Neumann Model&#xff09;&#xff0c;这是现代计算机体系结构的基础。以下是该模型的关键概念&#xff1a; 1.通用计算机&#xff1a; • 冯诺依曼提出的计算机是通用机器&#xff08;general- purpose&#xff09;&#xff0c;可以通过可…

如何防止架构师PM化?

目录标题 导读引言&#xff1a;什么是架构师PM化架构师PM化的特点亲力操刀的实质性工作越来越少更喜欢拉会催进度越来越难直接回答问题喜欢流程 架构师PM化的危害对项目的危害对组织的危害对架构师个人的危害对研发同学的危害 如何防止架构师PM化组织上要提倡做实事个人上要做点…

MySQL UDF提权原理

文章目录 前言一、MySQL架构二、什么是UDF三、UDF提权原理四、MSF实战参考 前言 看了许多视频和文章&#xff0c;对UDF提权讲得都不是很清楚&#xff0c;遂搜索了一下MySQL的基础知识&#xff0c;总结了一下&#xff0c;供各位初学的师傅参考。 一、MySQL架构 首先&#xff…

Broken pipe异常分析及处理

问题出现&#xff1a;生产上运行的系统业务正常&#xff0c;当在查询数据时&#xff0c;出现后台异常&#xff0c;检查后台日志出现Broken Pipe异常&#xff1b; 如图示&#xff1a; Broken Pipe定义&#xff1a;通常发生在服务器端尝试向已关闭的套接字&#xff08;客户端/端…

Datawhale 组队学习 文生图 Prompt攻防 task02随笔

往期task01链接&#xff1a;task01笔记 本期我们继续从赛季的评价方法切入&#xff0c;探讨如何通过大模型生成更加多样的提示词&#xff0c;让得分更高。 赛题评价方法 结合赛题的要求&#xff0c;赛题文生图大模型服务的全链路框架如下所示&#xff1a; 给定文本prompt&am…