当前位置: 首页 > news >正文

安卓实现连接wesokcet

在build.gradle里引入依赖:

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

在Androidmanifest.xml 文件里加入网络权限:

<uses-permission android:name="android.permission.INTERNET" />

代码:

package com.xmkjsoft.video_call;import android.content.Context;
import android.os.Bundle;
import android.widget.Toast;import androidx.appcompat.app.AppCompatActivity;import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;import java.net.URISyntaxException;public class MainActivity extends AppCompatActivity {private MyWebSocketClient webSocketClient;// 默认无参数构造函数public MainActivity() {}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);connectWebSocket();}private void connectWebSocket() {try {webSocketClient = new MyWebSocketClient("ws://192.168.28.218/ws/1233");webSocketClient.connect();} catch (URISyntaxException e) {e.printStackTrace();}}// 内部类,用于处理 WebSocket 连接状态和消息private class MyWebSocketClient extends WebSocketClient {public MyWebSocketClient(String serverUri) throws URISyntaxException {super(new java.net.URI(serverUri));}@Overridepublic void onOpen(ServerHandshake handshakedata) {// WebSocket 连接已打开System.out.println("WebSocket 连接已打开");}@Overridepublic void onMessage(String message) {// 收到文本消息System.out.println("收到文本消息:" + message);}@Overridepublic void onClose(int code, String reason, boolean remote) {// WebSocket 连接已关闭System.out.println("WebSocket 连接已关闭,code:" + code + ", reason:" + reason + ", remote:" + remote);}@Overridepublic void onError(Exception ex) {// WebSocket 连接出错System.out.println("WebSocket 连接出错:" + ex.getMessage());}}
}

服务端代码:

package com.xmkjsoft.video_call_server.websocket;import jakarta.websocket.*;
import jakarta.websocket.server.PathParam;
import jakarta.websocket.server.ServerEndpoint;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.CrossOrigin;import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;@CrossOrigin
@ServerEndpoint(value = "/ws/{userId}")
@Component
public class OnlineWebSocket {private Session session;private String userId;private static Set<OnlineWebSocket> onlineWebSocketSet = new CopyOnWriteArraySet<>();@OnOpenpublic void onOpen(Session session, @PathParam("userId") String userId) {this.session = session;this.userId = userId;onlineWebSocketSet.add(this);System.out.println("WebSocket 连接已建立,用户ID:" + userId);}@OnClosepublic void onClose(CloseReason reason) {onlineWebSocketSet.remove(this);System.out.println("WebSocket 连接已关闭,用户ID:" + userId);if (reason.getReasonPhrase().equals("EOFException")) {// 处理 EOFException 异常// 例如:重新建立连接或者通知用户连接已断开System.out.println("连接关闭原因:EOFException");}}@OnMessagepublic void onMessage(Session session, String message, @PathParam("userId") String userId) {this.session = session;this.userId = userId;if (!message.equals("ping")) {System.out.println("收到客户端,用户ID:" + userId + ",消息内容:" + message);} else {// 收到心跳回应,不做任何处理}}}

相关文章:

安卓实现连接wesokcet

在build.gradle里引入依赖&#xff1a; implementation org.java-websocket:Java-WebSocket:1.5.2 在Androidmanifest.xml 文件里加入网络权限&#xff1a; <uses-permission android:name"android.permission.INTERNET" /> 代码&#xff1a; package com.x…...

Xinstall助力App下载量精准统计,洞悉推广效果

在移动互联网时代&#xff0c;App的下载量是衡量一个应用受欢迎程度的重要指标。然而&#xff0c;要精准统计App的下载量并不是一件容易的事情。为了解决这一难题&#xff0c;越来越多的开发者选择了Xinstall这一专业的App全渠道统计服务商。 Xinstall作为国内领先的App统计平…...

CSS字体修饰

1&#xff09;文字大小 &#xff08; font-size &#xff09; /* 设置文字大小为24个像素 */ font-size: 24px; 2&#xff09;字体粗细 &#xff08; font-weight &#xff09; /* 字体粗细在100-900之间可以进行调整 */ /* 字体加粗 */ font-weight: bolder; /* 或 fon…...

高并发缓存服务的构建要点与陷阱

1. 缓存基础与特征 在讨论高并发环境下构建缓存服务的问题前&#xff0c;我们需要先了解缓存的基础和特征。缓存&#xff08;Cache&#xff09;是一种高速数据存储层&#xff0c;它可以存储临时数据&#xff0c;以便将来的请求能更快地获取到这些数据。从本质上讲&#xff0c;…...

Electron学习笔记(五)

文章目录 相关笔记笔记说明 七、系统1、系统对话框2、自定义窗口菜单3、系统右键菜单4、快捷键(1)、监听网页按键事件 &#xff08;窗口需处于激活状态&#xff09;(2)、监听全局按键事件 &#xff08;窗口无需处于激活状态&#xff09;(3)、补充&#xff1a;自定义窗口菜单快捷…...

【jest 调试 - vscode debug】

jest 测试typescript&#xff0c;如果想对测试文件本身断点调试。 安装jest相关依赖 # jest本体 npm install --save-dev jest # jest的类型声明 npm install --save-dev types/jest # typescript中使用 npm install --save-dev ts-jestlaunch.json 配置参考 {"type&qu…...

华为OD机试【分奖金】(java)(100分)

1、题目描述 公司老板做了一笔大生意&#xff0c;想要给每位员工分配一些奖金&#xff0c;想通过游戏的方式来决定每个人分多少钱。按照员工的工号顺序&#xff0c;每个人随机抽取一个数字。按照工号的顺序往后排列&#xff0c;遇到第一个数字比自己数字大的&#xff0c;那么&…...

27- ESP32-S3 USB虚拟串口(USB-OTG 外设介绍)

ESP32-S3 USB虚拟串口详解 USB-OTG 外设介绍 USB-OTG&#xff1a; USB-OTG是一种USB规范&#xff0c;允许嵌入式系统&#xff08;如手机、平板电脑、单片机系统等&#xff09;在没有主机&#xff08;如个人电脑&#xff09;的情况下直接相互通信&#xff0c;同时也能够作为传…...

PostgreSQL查看sql的执行计划

PostgreSQL查看sql的执行计划 基础信息 OS版本&#xff1a;Red Hat Enterprise Linux Server release 7.9 (Maipo) DB版本&#xff1a;16.2 pg软件目录&#xff1a;/home/pg16/soft pg数据目录&#xff1a;/home/pg16/data 端口&#xff1a;5777在PostgreSQL中&#xff0c;查看…...

macOS Ventura 13如何设置定时重启(命令行)

文章目录 macOS Ventura 13如何设置定时重启(命令行)前言具体设置步骤及命令解释其他 macOS Ventura 13如何设置定时重启(命令行) 前言 由于升级 macOS 13 Ventura 之后&#xff0c;之前在节能里面通过鼠标点击设置开机关机的方法不能用了&#xff0c;现在只能用命令设置开机…...

【sass简介以及如何安装使用】

Sass&#xff08;Syntactically Awesome Stylesheets&#xff09;是一个层叠样式表&#xff08;CSS&#xff09;预处理器&#xff0c;它扩展了CSS的语法&#xff0c;并增加了许多有用的功能&#xff0c;如变量、嵌套、混合&#xff08;Mixin&#xff09;、继承以及模块化的结构…...

Git版本控制工具的原理及应用详解(四)

本系列文章简介&#xff1a; 随着软件开发的复杂性不断增加&#xff0c;版本控制成为了开发团队中不可或缺的工具之一。在过去的几十年里&#xff0c;版本控制工具经历了各种发展和演变&#xff0c;其中Git无疑是目前最受欢迎和广泛应用的版本控制工具之一。 Git的出现为开发者…...

AI图书推荐:ChatGPT全面指南—用AI帮你更健康、更富有、更智慧

你是否在努力改善你的健康&#xff1f; 你是否长期遭受财务困难&#xff1f; 你想丰富你的思想、身体和灵魂吗&#xff1f; 如果是这样&#xff0c;那么这本书就是为你准备的。 《ChatGPT全面指南—用AI帮你更健康、更富有、更智慧》&#xff08;CHATGPT Chronicles AQuick…...

C++ | Leetcode C++题解之第92题反转链表II

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode *reverseBetween(ListNode *head, int left, int right) {// 设置 dummyNode 是这一类问题的一般做法ListNode *dummyNode new ListNode(-1);dummyNode->next head;ListNode *pre dummyNode;for (i…...

【管理咨询宝藏99】离散制造智能工厂战略规划方案

本报告首发于公号“管理咨询宝藏”&#xff0c;如需阅读完整版报告内容&#xff0c;请查阅公号“管理咨询宝藏”。 【管理咨询宝藏99】离散制造智能工厂战略规划方案 【格式】PDF版本 【关键词】智能制造、先进制造业转型、数字化转型 【核心观点】 - 推进EHS、品质一致性、生…...

java8 Stream使用中的一些实践

文章目录 使用Stream将List转换为Map时key冲突问题使用Stream时得到List的size为不为0&#xff0c;元素Object为null问题 使用Stream将List转换为Map时key冲突问题 如下&#xff1a; 把userList转换为userMap id为key user 为value 由于user2和user3的id相同&#xff0c;所以会…...

入门篇:Kafka基础知识·

目录 一、Kafka简介 二、Kafka核心组件 三、Kafka安装与配置 1.下载与解压 2.配置环境变量 3.配置server.properties 4.启动Kafka服务 四、Kafka基本操作 1.创建Topic 2.查看Topic列表 3.发送消息 4.接收消息 五、Kafka进阶使用 1.消息持久化与存储 2.消息顺序与…...

SWAT模型高阶应用暨SWAT模型无资料地区建模、不确定分析及气候、土地利用变化对水资源与面源污染影响分析

原文链接&#xff1a;SWAT模型高阶应用暨SWAT模型无资料地区建模、不确定分析及气候、土地利用变化对水资源与面源污染影响分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247604401&idx4&snd2d39846dce07bee765c820de1cf92f3&chksmfa821956cdf5904…...

每日一题——力扣206. 反转链表(举一反三、思想解读)

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三题目链接 目录 菜鸡写法​编辑 代码点评 代码分析 时间复杂度 空间复杂度 专业点评 另一种方法​编辑 代码点评 代码逻辑 时间复杂度 空间…...

【qt】纯代码界面设计

界面设计目录 一.界面设计的三种方式1.使用界面设计器2.纯代码界面设计3.混合界面设计 二.纯代码进行界面设计1.代码界面设计的总思路2.创建项目3.设计草图4.添加组件指针5.初始化组件指针6.添加组件到窗口①水平布局②垂直布局③细节点 7.定义槽函数8.初始化信号槽9.实现槽函数…...

Elsevier投稿状态追踪:告别手动刷新,让审稿进度一目了然

Elsevier投稿状态追踪&#xff1a;告别手动刷新&#xff0c;让审稿进度一目了然 【免费下载链接】Elsevier-Tracker 项目地址: https://gitcode.com/gh_mirrors/el/Elsevier-Tracker 还在为Elsevier投稿系统的繁琐查询而烦恼吗&#xff1f;每次登录系统查看审稿进度都需…...

暗黑3技能自动化释放:告别机械操作,重燃战斗激情 - 基于AutoHotkey的智能宏工具实现

暗黑3技能自动化释放&#xff1a;告别机械操作&#xff0c;重燃战斗激情 - 基于AutoHotkey的智能宏工具实现 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelpe…...

OpenCore Legacy Patcher终极指南:老款Mac焕新升级的完整解决方案

OpenCore Legacy Patcher终极指南&#xff1a;老款Mac焕新升级的完整解决方案 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher OpenCore Legacy Patcher是一款…...

Claude Code 常用技巧:这几个操作让我开发效率翻倍

Claude Code 常用技巧&#xff1a;这几个操作让我开发效率翻倍 说实话&#xff0c;用 Claude Code 差不多也有小半年了&#xff0c;从一开始"就这&#xff1f;"的怀疑&#xff0c;到现在每天开工第一件事就是把它招呼进来&#xff0c;中间踩了不少坑&#xff0c;也真…...

LingBot-Depth案例分享:修复SLAM生成的稀疏深度,效果实测

LingBot-Depth案例分享&#xff1a;修复SLAM生成的稀疏深度&#xff0c;效果实测 1. 引言&#xff1a;SLAM深度修复的挑战 在机器人导航和增强现实应用中&#xff0c;SLAM&#xff08;同步定位与地图构建&#xff09;系统生成的深度图往往存在一个显著问题&#xff1a;稀疏性…...

软萌拆拆屋惊艳效果:多层叠穿服饰逐层展开结构图生成案例

软萌拆拆屋惊艳效果&#xff1a;多层叠穿服饰逐层展开结构图生成案例 1. 引言&#xff1a;当AI遇见“拆解美学” 想象一下&#xff0c;你有一件设计精巧的洛丽塔裙子&#xff0c;上面缀满了蕾丝、蝴蝶结和复杂的褶皱。你想向别人展示它的每一个精妙细节&#xff0c;但一张普通…...

长尾关键词SEO优化费用如何计算_企业自营SEO关键词优化成本是多少

长尾关键词SEO优化费用如何计算_企业自营SEO关键词优化成本是多少 在当今数字化时代&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;已经成为企业提升网站流量、增加品牌曝光度的重要手段。其中&#xff0c;长尾关键词SEO优化因其较低的竞争度和高转化率&#xff0c;备受…...

Token 成本暴跌 280 倍,为什么用 AI 替代初级开发,依然算不拢账?

从董事会的 PPT 翻车&#xff0c;看 AI 降本神话背后的全成本真相上周我旁听了一场 C-suite 高管会议&#xff0c;亲眼看着一位副总裁被自己的 PPT 逼入绝境。会议的主题是 AI 项目的成本收益&#xff0c;他准备了一套无懈可击的逻辑&#xff1a;大模型 Token 价格 3 年暴跌 28…...

国产AI Agent爆发:从“龙虾风暴”看企业级Agent工具选型与实战指南

摘要&#xff1a; 作为一名在企业架构领域摸爬滚打15年的老兵&#xff0c;我见证了从SOA到微服务&#xff0c;再到如今AI原生架构的数次演进。2026年3月底&#xff0c;国内AI圈掀起的“龙虾风暴”标志着Agent工具正式进入爆发期。然而&#xff0c;对于IT负责人和CIO而言&#x…...

AI核心概念解析:Agent、Prompt、Skill 及生态关系

&#x1f310; AI核心概念解析&#xff1a;Agent、Prompt、Skill 及生态关系 一、关键名词正确定义与原理 1. Agent&#xff08;智能体&#xff09; 指具备感知—决策—行动闭环能力的自主软件实体。它不是单个模型&#xff0c;而是一个系统架构&#xff1a;接收输入&#x…...