安卓websocket(客服端和服务端写在app端) 案例
废话不多说直接上代码
首选导入
implementation "org.java-websocket:Java-WebSocket:1.4.0"
package com.zx.qnncpds.androidwbsocket;import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;import androidx.appcompat.app.AppCompatActivity;import com.zx.qnncpds.androidwbsocket.client.ClientActivity;
import com.zx.qnncpds.androidwbsocket.service.ServiceActivity;public class MainActivity extends AppCompatActivity implements View.OnClickListener {private Button btn1;private Button btn2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);btn1 = findViewById(R.id.btn1);btn2 = findViewById(R.id.btn2);btn1.setOnClickListener(this);btn2.setOnClickListener(this);}@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.btn1://客户端startActivity(new Intent(MainActivity.this, ClientActivity.class));break;case R.id.btn2://服务端startActivity(new Intent(MainActivity.this, ServiceActivity.class));break;default:break;}}
}
布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><Buttonandroid:id="@+id/btn1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="客服端" /><Buttonandroid:id="@+id/btn2"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="服务端" />
</LinearLayout>
客服端
package com.zx.qnncpds.androidwbsocket.client;import androidx.appcompat.app.AppCompatActivity;import android.os.Bundle;
import android.view.View;
import android.widget.Button;import com.zx.qnncpds.androidwbsocket.R;import java.net.URI;
import java.net.URISyntaxException;public class ClientActivity extends AppCompatActivity implements ClientWebSocketListener {private WebSocketClient webSocketClient;private Button btn_send;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_client);btn_send=findViewById(R.id.btn_send);btn_send.setOnClickListener(v -> sendMessage("测试消息"));try {// 替换为你的WebSocket服务器URIURI uri = new URI("ws://10.10.10.104:9007");webSocketClient = new WebSocketClient(uri, this);webSocketClient.connect();} catch (URISyntaxException e) {e.printStackTrace();}}/*** @param message 当WebSocket接收到消息时调用此方法*/@Overridepublic void onMessage(final String message) {}/*** @param message 连接打开*/@Overridepublic void onOpen(String message) {}/*** @param message 连接关闭*/@Overridepublic void onClose(String message) {}/*** @param message 出现错误*/@Overridepublic void onError(String message) {}public void sendMessage(String message) {// 发送一个消息到WebSocket服务器if (webSocketClient != null && webSocketClient.isOpen()) {webSocketClient.send(message);}}@Overrideprotected void onDestroy() {super.onDestroy();// 关闭WebSocket连接以避免内存泄露if (webSocketClient != null) {webSocketClient.close();}}
}
package com.zx.qnncpds.androidwbsocket.client;public interface ClientWebSocketListener {/*** @param message 当WebSocket接收到消息时调用此方法*/void onMessage(final String message);/*** @param message 连接打开*/void onOpen(final String message);/*** @param message 连接关闭*/void onClose(final String message);/*** @param message 出现错误*/void onError(final String message);
}
package com.zx.qnncpds.androidwbsocket.client;import org.java_websocket.handshake.ServerHandshake;import java.net.URI;public class WebSocketClient extends org.java_websocket.client.WebSocketClient {private ClientWebSocketListener webSocketListener;public WebSocketClient(URI serverUri, ClientWebSocketListener listener) {super(serverUri);this.webSocketListener = listener;}@Overridepublic void onOpen(ServerHandshake handshakeData) {System.out.println("WebSocket 连接打开");if (webSocketListener != null) {webSocketListener.onOpen("WebSocket 连接打开");}}@Overridepublic void onMessage(String message) {if (webSocketListener != null) {webSocketListener.onMessage(message);}}@Overridepublic void onClose(int code, String reason, boolean remote) {System.out.println("WebSocket 连接关闭");if (webSocketListener != null) {webSocketListener.onClose("WebSocket 连接关闭");}}@Overridepublic void onError(Exception ex) {System.out.println("WebSocket 出现错误: " + ex.getMessage());if (webSocketListener != null) {webSocketListener.onError("WebSocket 出现错误: " + ex.getMessage());}}
}
服务端
package com.zx.qnncpds.androidwbsocket.service;import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;import com.zx.qnncpds.androidwbsocket.R;import org.java_websocket.WebSocket;import java.io.IOException;public class ServiceActivity extends Activity implements ServiceWebSocketListener {// WebSocket服务器的实例private AndroidWebSocketServer server;private TextView tv_state;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_service);tv_state=findViewById(R.id.tv_state);// 创建并启动WebSocket服务器server = new AndroidWebSocketServer(8887, this);server.start();}@Overridepublic void onClientOpen(WebSocket conn, String address) {runOnUiThread(() -> {// 更新UI显示连接的客户端的地址// 例如:更新一个文本视图来显示已连接tv_state.setText(address);});}@Overridepublic void onClientClose(WebSocket conn, int code, String reason, boolean remote) {runOnUiThread(() -> {// 更新UI以表示客户端断开连接// 例如:更新列表视图中的项目tv_state.setText("客户端以断开");});}@Overridepublic void onClientMessage(WebSocket conn, String message) {runOnUiThread(() -> {// 在UI上展示收到的消息// 例如:将消息添加到聊天窗口tv_state.setText(message);});}@Overridepublic void onClientError(WebSocket conn, Exception ex) {runOnUiThread(() -> {// 在UI上展示错误信息// 例如:展示一个错误弹窗});}@Overridepublic void onServerStart() {runOnUiThread(() -> {// 更新UI表示服务器已经启动// 例如:改变一个文本视图的文本tv_state.setText("服务器已启动");});}@Overrideprotected void onDestroy() {super.onDestroy();if (server != null) {try {server.stop();} catch (IOException | InterruptedException e) {throw new RuntimeException(e);}}}// 广播消息给所有WebSocket客户端public void broadcastToAll(String message) {server.broadcastMessage(message);}// 发送消息给特定的WebSocket客户端public void sendToClient(WebSocket client, String message) {server.sendMessageToClient(client, message);}
}
package com.zx.qnncpds.androidwbsocket.service;import org.java_websocket.WebSocket;
import org.java_websocket.handshake.ClientHandshake;
import org.java_websocket.server.WebSocketServer;import java.net.InetSocketAddress;public class AndroidWebSocketServer extends WebSocketServer {// 事件监听器,用于将事件通知给ServiceActivityprivate ServiceWebSocketListener serviceWebSocketListener;/*** 构造函数。* @param port 服务器侦听的端口号。* @param serviceWebSocketListener 事件发生时的回调监听器。*/public AndroidWebSocketServer(int port, ServiceWebSocketListener serviceWebSocketListener) {super(new InetSocketAddress(port));this.serviceWebSocketListener = serviceWebSocketListener;}public AndroidWebSocketServer(int port) {super(new InetSocketAddress(port));}@Overridepublic void onOpen(WebSocket conn, ClientHandshake handshake) {// 客户端连接打开时调用监听器的onClientOpen方法String address = conn.getRemoteSocketAddress().getAddress().getHostAddress();serviceWebSocketListener.onClientOpen(conn, address);}@Overridepublic void onClose(WebSocket conn, int code, String reason, boolean remote) {// 客户端连接关闭时调用监听器的onClientClose方法String address = conn.getRemoteSocketAddress().getAddress().getHostAddress();serviceWebSocketListener.onClientClose(conn, code, reason, remote);}@Overridepublic void onMessage(WebSocket conn, String message) {// 接收到客户端消息时调用监听器的onClientMessage方法serviceWebSocketListener.onClientMessage(conn, message);}@Overridepublic void onError(WebSocket conn, Exception ex) {// 连接发生错误时调用监听器的onClientError方法serviceWebSocketListener.onClientError(conn, ex);}@Overridepublic void onStart() {// WebSocket服务器启动时调用监听器的onServerStart方法serviceWebSocketListener.onServerStart();}// 发送消息到所有连接的WebSocket客户端public void broadcastMessage(String message) {broadcast(message);}// 发送消息到特定的WebSocket客户端public void sendMessageToClient(WebSocket conn, String message) {if (conn != null) {conn.send(message);}}
}
package com.zx.qnncpds.androidwbsocket.service;import org.java_websocket.WebSocket;public interface ServiceWebSocketListener {/**当客户端连接打开时调用* @param conn* @param address*/void onClientOpen(WebSocket conn, String address);// 当客户端连接关闭时调用/** 当客户端连接关闭时调用* @param conn* @param code* @param reason* @param remote*/void onClientClose(WebSocket conn, int code, String reason, boolean remote);/**当接收到客户端消息时调用* @param conn* @param message*/void onClientMessage(WebSocket conn, String message);/*** 当客户端连接发生错误时调用* @param conn* @param ex*/void onClientError(WebSocket conn, Exception ex);/***当WebSocket服务器启动时调用*/void onServerStart();
}
布局加一个文本这就不写了(服务端和客服端都一样)
项目案例 https://download.csdn.net/download/qq_41733851/88885469?spm=1001.2014.3001.5503
相关文章:
安卓websocket(客服端和服务端写在app端) 案例
废话不多说直接上代码 首选导入 implementation "org.java-websocket:Java-WebSocket:1.4.0" package com.zx.qnncpds.androidwbsocket;import android.content.Intent; import android.os.Bundle; import android.view.View; import android.widget.Button;import a…...
C++面试宝典第34题:整数反序
题目 给出一个不多于5位的整数, 进行反序处理。要求: 1、求出它是几位数。 2、分别输出每一位数字。仅数字间以空格间隔, 负号与数字之间不需要间隔。如果是负数,负号加在第一个数字之前, 与数字没有空格间隔。注意:最后一个数字后没有空格。 3、按逆序输出各位数字。逆序后…...
微信商城小程序设计
简介 完整实现了集下单、支付、物流、评价、退款等功能的微信商城版小程序以及商城的管理后台,涉及商品的分类、规格的配置,商品上架等等。 产品效果图 项目链接 java后台:mall微信商城: 微信商城小程序。完整实现了集下单、支付、物流、评…...
如何合理布局子图--确定MATLAB的subplot子图位置参数
确定MATLAB的subplot子图位置参数 目录 确定MATLAB的subplot子图位置参数摘要1. 问题描述2. 计算过程2.1 确定子图的大小和间距2.2 计算合适的figure大小2.3 计算每个子图的position数据 3. MATLAB代码实现3.1 MATLAB代码3.2 绘图结果 4. 总结 摘要 在MATLAB中,使用…...
【MySQL】基于Docker搭建MySQL一主二从集群
本文记录了搭建mysql一主二从集群,这样的一个集群master为可读写,slave为只读。过程中使用了docker,便于快速搭建单体mysql。 1,准备docker docker的安装可以参考之前基于yum安装docker的文章[1]。 容器相关命令[2]。 查看正在…...
k8s 集群调度,标签,亲和性和反亲和性,污点和容忍,pod启动状态 排错详解
目录 pod启动创建过程 kubelet持续监听的原因 调度概念 调度约束 调度过程 优点 原理 优先级选项 示例 指定调度节点 标签基本操作 获取标签帮助 添加标签(Add Labels): 更新标签(Update Labels) 删除标…...
Idea 启动报错 failed to create jvm:jvm path url
1、情况 针对于在 idea 中,通过界面的形式改了 -Xmx 等类似的参数,并且设置的值过大,导致下次启动 idea 报错 2、解决 找到如图所示的文件 打开编辑该文件,把类似 -Xmx 等参数的值调小,保存文件并关闭࿰…...
20款Visual Studio实用插件推荐
前言 俗话说的好工欲善其事必先利其器,安装一些实用的Visual Studio插件对自己日常的开发和工作效率能够大大的提升,避免996从选一款好的IDE实用插件开始。以下是我认为比较实用的Visual Studio插件,希望对大家有所帮助。 各位小伙伴有更好的…...
基于SpringBoot的在线拍卖系统
目录 1、 前言介绍 2、主要技术 3、系统流程和逻辑 4、系统结构设计 5、数据库设计表 6、运行截图(部分) 6.1管理员功能模块 6.2用户功能模块 6.3前台首页功能模块 7、源码获取 基于SpringBoot的在线拍卖系统录像 1、 前言介绍 随着社会的发展,社会的各行…...
“互动+消费”时代,借助华为云GaussDB重构新零售中消费逻辑
场与人的关系 “人—货—场”是零售中重要的三要素,我们一直在追求,将零售中的人、货、场进行数字化并在云端进行整合,形成属于我们自己的云平台。 随着互联网技术为信息提供的便利,消费者的集体力量正在逐渐形成一股强大的反向…...
AI大全-通往AGI之路
背景 自从AI大模型出来之后,就有很多做资源整理的社区,整理学习资料,整理各种AI工具大全,我也整理过一段时间的最新AI的资讯,也曾尝试去弄一个AI的入口类的东西。但是最近看到一个在飞书上的分享,我觉得他…...
CSS中如何解决 1px 问题?
1px 问题指的是:在一些 Retina屏幕 的机型上,移动端页面的 1px 会变得很粗,呈现出不止 1px 的效果。原因很简单——CSS 中的 1px 并不能和移动设备上的 1px 划等号。它们之间的比例关系有一个专门的属性来描述: window.devicePix…...
IO 与 NIO
优质博文:IT-BLOG-CN 一、阻塞IO / 非阻塞NIO 阻塞IO:当一条线程执行read()或者write()方法时,这条线程会一直阻塞直到读取到了一些数据或者要写出去的数据已经全部写出,在这期间这条线程不能做任何其他的事情。 非阻塞NIO&…...
YOLOv应用开发与实现
一、背景与简介 YOLO(You Only Look Once)是一种流行的实时目标检测系统,其核心思想是将目标检测视为回归问题,从而可以在单个网络中进行端到端的训练。YOLOv作为该系列的最新版本,带来了更高的检测精度和更快的处理速…...
【C语言】熟悉文件基础知识
欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 文件 为了数据持久化保存,使用文件,否则数据存储在内存中,程序退出,内存回收,数据就会丢失。 程序设计中&…...
信息系统安全与对抗-作业2
目录 1、使用自己姓名拼音创建一个账户, 并使用命令和图形化查看 2、使用自己拼音打头字母创建一个隐藏账户 ,并使用命令和图形化查看 3、使用命令启动 telnet 服务 4、使用命令打开防火墙 23 端口 5、熟悉LINUX系统,使用命令行创建用户…...
【软考高项】【计算专题】- 5 - 进度类 - 横道图/甘特图
一、知识点 1、基本定义 甘特图(Gantt chart )又称为横道图、条状图(Bar chart),通过条状图来显示项目各活动的进 度情况。以提出者亨利劳伦斯甘特( Henry Laurence Gantt)先生的名字命名。 目前许多文档工具都可以画甘特图。 (1)我的举例 …...
Ubuntu20.04使用XRDP安装原生远程桌面
Ubuntu20.04使用XRDP安装原生远程桌面 1.安装gnome桌面 # 如果没有更新过源缓存,先更新一下 sudo apt update# 安装gnome桌面 # 可选参数 --no-install-recommends,不安装推荐组件,减少安装时间和空间占用 sudo apt install ubuntu-desktop…...
uniapp:启动图 .9png 制作教程
1、工具安装:自行下载Android Studio 2、制作.9png 注意上图3条黑线的位置,意思是:标注黑线的位置可以进行缩放。 对其大多数启动图来说,标注以上3条黑线即可。...
NVMFS5113PLWFT1G汽车级功率MOSFET 60V 10A/64A满足AEC-Q101标准
AEC-Q101认证标准详细解读: AEC-Q101是一种汽车电子元件可靠性标准,由汽车电子委员会(Automotive Electronics Council,简称AEC)制定。该标准旨在确保在汽车环境中使用的电子元件具有足够的可靠性和耐久性。 AEC-Q10…...
(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
根据万维钢·精英日课6的内容,使用AI(2025)可以参考以下方法:
根据万维钢精英日课6的内容,使用AI(2025)可以参考以下方法: 四个洞见 模型已经比人聪明:以ChatGPT o3为代表的AI非常强大,能运用高级理论解释道理、引用最新学术论文,生成对顶尖科学家都有用的…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
如何更改默认 Crontab 编辑器 ?
在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...
nnUNet V2修改网络——暴力替换网络为UNet++
更换前,要用nnUNet V2跑通所用数据集,证明nnUNet V2、数据集、运行环境等没有问题 阅读nnU-Net V2 的 U-Net结构,初步了解要修改的网络,知己知彼,修改起来才能游刃有余。 U-Net存在两个局限,一是网络的最佳深度因应用场景而异,这取决于任务的难度和可用于训练的标注数…...
