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

spingboot中创建简单的WebSocket服务和使用OKHttp创建socket客户端接收数据

背景

springboot 中使用okhttp3创建webSocket服务端 server1 和客户端
client1,客户端clinet1调用server1用于发送图片,创建客户端client2接收此图片.

在Spring
Boot中使用OkHttp3创建WebSocket服务端和客户端,涉及到两个不同的操作:建立WebSocket服务端和创建WebSocket客户端。OkHttp3库主要用于客户端操作,因此对于服务端,我们将使用Spring的WebSocket支持。

步骤 1: 创建WebSocket服务端(Server1)

  1. 添加Spring WebSocket依赖

pom.xml中添加Spring Boot的WebSocket依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
  1. 配置WebSocket

创建一个配置类来启用WebSocket并注册一个endpoint:

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/ws").setAllowedOrigins("*").withSockJS();}@Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) {registry.enableSimpleBroker("/topic");registry.setApplicationDestinationPrefixes("/app");}
}
  1. 创建消息处理器

创建一个控制器来处理发送到服务端的消息:

import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;@Controller
public class ImageMessageController {@MessageMapping("/receive-image")@SendTo("/topic/image")public byte[] receiveImage(byte[] imageData) {// 处理接收到的图片数据return imageData; // 将图片数据转发到订阅了 /topic/image 的客户端}
}

步骤 2: 创建WebSocket客户端(Client1)

  1. 添加OkHttp依赖

pom.xml中添加OkHttp3依赖:

<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.9.0</version> <!-- 请使用最新版本 -->
</dependency>
  1. 创建WebSocket客户端

创建一个客户端来连接到WebSocket服务端并发送图片:

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.WebSocket;
import okhttp3.WebSocketListener;
import okio.ByteString;public class ImageWebSocketClient extends WebSocketListener {private final OkHttpClient client = new OkHttpClient();private WebSocket webSocket;public void connect(String url) {Request request = new Request.Builder().url(url).build();webSocket = client.newWebSocket(request, this);}public void sendImage(byte[] imageData) {if (webSocket != null) {webSocket.send(ByteString.of(imageData));}}@Overridepublic void onOpen(WebSocket webSocket, okhttp3.Response response) {super.onOpen(webSocket, response);// WebSocket连接成功建立}@Overridepublic void onMessage(WebSocket webSocket, ByteString bytes) {super.onMessage(webSocket, bytes);// 处理接收到的二进制消息}@Overridepublic void onClosed(WebSocket webSocket, int code, String reason) {super.onClosed(webSocket, code, reason);// 处理WebSocket关闭事件}@Overridepublic void onFailure(WebSocket webSocket, Throwable t, okhttp3.Response response) {super.onFailure(webSocket, t, response);// 处理WebSocket连接失败事件}public void close() {if (webSocket != null) {webSocket.close(1000, "End of session");}}
}

步骤 3: 创建另一个客户端(Client2)

创建另一个客户端来接收由Client1发送的图片:

public class ImageReceivingClient extends WebSocketListener {private final OkHttpClient client = new OkHttpClient();private WebSocket webSocket;public void connect(String url) {Request request = new Request.Builder().url(url).build();webSocket = client.newWebSocket(request, this);}@Overridepublic void onMessage(WebSocket webSocket, ByteString bytes) {super.onMessage(webSocket, bytes);// 处理接收到的图片数据byte[] imageData = bytes.toByteArray();// 可以在这里将图片数据保存到文件或进行其他处理}public void close() {if (webSocket != null) {webSocket.close(1000, "End of session");}}
}

步骤 4: 使用客户端

在你的服务中,使用上面创建的ImageWebSocketClientImageReceivingClient来发送和接收图片。

public class WebSocketService {public void sendImage(String url, byte[] imageData) {ImageWebSocketClient client = new ImageWebSocketClient();client.connect(url);client.sendImage(imageData);client.close();}public void receiveImage(String url) {ImageReceivingClient client = new ImageReceivingClient();client.connect(url);// 保持连接,直到需要断开}
}

注意事项

  • 确保WebSocket服务端和客户端使用相同的协议(ws://或wss://)。
  • 在生产环境中,确保使用wss://来加密WebSocket连接。
  • 处理WebSocket连接的异常和错误,确保应用的健壮性。

相关文章:

spingboot中创建简单的WebSocket服务和使用OKHttp创建socket客户端接收数据

背景 springboot 中使用okhttp3创建webSocket服务端 server1 和客户端 client1&#xff0c;客户端clinet1调用server1用于发送图片&#xff0c;创建客户端client2接收此图片. 在Spring Boot中使用OkHttp3创建WebSocket服务端和客户端&#xff0c;涉及到两个不同的操作&#xff…...

Redis入门2

在java中操作Redis Redis的Java客户端 Redis 的 Java 客户端很多&#xff0c;常用的几种: Jedis Lettuce Spring Data Redis Spring Data Redis 是 Spring 的一部分&#xff0c;对 Redis 底层开发包进行了高度封装。 在 Spring 项目中&#xff0c;可以使用Spring Data R…...

嵌入式Linux:信号是什么?

目录 1、信号的来源 2、信号的处理方式 3、信号的异步性 4、信号编号 信号是Linux系统中用于通知进程事件发生的一种机制&#xff0c;可以将其视为一种软件中断。信号类似于硬件中断&#xff0c;能够打断进程当前的执行流程&#xff0c;从而实现对中断机制的一种软件层面的…...

教你搭建一个wifi贴系统

大家好&#xff0c;我是鲸天科技千千&#xff0c;大家都知道我是做小程序开发的&#xff0c;平时会给大家分享一些互联网相关的创业项目&#xff0c;感兴趣的可以跟我关注一下。 搭建一个首先就是要搭建一个自己的wifi贴小程序&#xff0c;我们自己的工作就是把这个小程序推广…...

C#中的LINQ语句

LINQ&#xff08;Language Integrated Query&#xff09;是 .NET Framework 中的一个功能强大的查询语言&#xff0c;它允许开发者使用类似 SQL 的语法来查询和操作数据。在 C# 中&#xff0c;LINQ 可以用于查询数组、列表、集合、XML 文档、关系数据库等。以下是一些常见的 LI…...

【C++】——string(模拟实现)

文章目录 string类构造string类拷贝构造string类析构string类运算符重载string类部分常用接口的模拟实现 这篇博客中构造、拷贝构造、析构、还有一些短小频繁调用的函数就不用做函数和定义分离&#xff0c;因为在类中&#xff0c;这种函数会默认是内联函数 string类构造 构造函…...

c++20 std::format 格式化说明

在标头<format>定义 ()功能很强大&#xff0c;它把字符串当成一个模板&#xff0c;通过传入的参数进行格式化&#xff0c;并且使用大括号‘{}’作为特殊字符代替‘%’。 1、基本用法 &#xff08;1&#xff09;不带编号&#xff0c;即“{}”&#xff08;2&#xff09;带…...

HTB-Unified(log4j2漏洞、MongoDb替换管理员密码)

前言 各位师傅大家好&#xff0c;我是qmx_07&#xff0c;今天给大家讲解Unified靶机 渗透过程 信息搜集 服务器开放了SSH服务&#xff0c;HTTP服务 访问网站 验证log4j2漏洞 8443端口&#xff1a;UniFi 网络 &#xff0c;访问查询 是否有Nday漏洞利用 可以观察到UniFi的版…...

每天五分钟深度学习PyTorch:不同的神经网络层设置不同的学习率

本文重点 我们前面学习了基本网络模型的搭建,获取网络模型的子结构,以及优化器optim,我们发现我们设置优化器的时候,是对整个模型设置的,也就是说整个模型的参数学习率是一样,本节课程我们学习如何给不同的网络层设置不同的学习率。主要还是通过优化器optim来实现的,本…...

【渗透测试】——DVWA靶场搭建

&#x1f4d6; 前言&#xff1a;DVWA&#xff08;Damn Vulnerable Web Application&#xff09;是一个用于安全漏洞测试的 PHP/MySQL 网络应用&#xff0c;旨在为安全专业人士提供一个合法的环境&#xff0c;以测试他们的技能和工具&#xff0c;同时帮助 Web 开发者更好地理解 …...

国内人工智能产业发展现状及对策研究

一、引言 人工智能作为新时代科技革命和产业变革的核心力量&#xff0c;正深刻改变着全球经济格局。我国政府高度重视人工智能产业发展&#xff0c;将其列为国家战略性新兴产业。在此背景下&#xff0c;本文旨在分析我国人工智能产业发展现状&#xff0c;探讨面临的挑战&#x…...

完整版订单超时自动取消功能

前几天对实习还是继续学习技术产生了抉择&#xff0c;问了一个前辈&#xff0c;他抛给我一个问题&#xff0c;怎么做15分钟订单自动取消&#xff0c;我说然后到时间之后&#xff0c;自动执行这个订单关闭业务&#xff0c;比如把锁了的库存给解开等等操作&#xff0c;然后在数据…...

算法刷题:300. 最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组、1143. 最长公共子序列

300. 最长递增子序列 1.dp定义&#xff1a;dp[i]表示i之前包括i的以nums[i]结尾的最长递增子序列的长度 2.递推公式&#xff1a;if (nums[i] > nums[j]) dp[i] max(dp[i], dp[j] 1); 注意这里不是要dp[i] 与 dp[j] 1进行比较&#xff0c;而是我们要取dp[j] 1的最大值…...

go 笔记

数据结构与 方法&#xff08;增删改查&#xff09; 安装goland,注意版本是2024.1.1&#xff0c;不是2024.2.1&#xff0c;软件下载地址也在链接中提供了 ‘go’ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 在 Windows 搜索栏中输入“环境变量”&#…...

路由等保测评

1.身份鉴别 应对登录的用户进行身份标识和鉴别&#xff0c; 身份标识具有唯一性&#xff0c;身份鉴别信息具有复杂度要求并定期更换。 可以使用“ service password-encryption"命令对存储在配置文件中的所有口令和类似数据进行加密&#xff0c; 以避免攻击者通过读取配…...

C# 反射之动态生成dll/exe

这个可能应该属于反射的高级使用范围了&#xff0c;平常在项目中使用的人估计也不是很多。由于使用反射的话会降低性能&#xff0c;比如之前用到的GetValue、SetValue等之类&#xff0c;但是使用这种方式会大大提高效率&#xff0c;在这里我只想说&#xff0c;都直接写IL指令了…...

Rust 所有权 Slices

文章目录 发现宝藏1. Slice 的基础知识1.1 什么是 Slice&#xff1f;1.2 如何创建 Slice&#xff1f; 2. 处理字符串 Slice2.1 字符串的 Slice2.2 字符串的 Unicode 和切片 3. 在函数中使用 Slice3.1 传递 Slice 给函数3.2 可变 Slice 的函数 4. 复杂示例4.1 处理多维数组的 Sl…...

windows 安全与网络管理问题

问题&#xff1a;当编写的脚本或程序运行的时候&#xff0c;可能被windows阻止访问网络甚至被删除 避免被删除 wini 进入设置界面 -> 选择更新与安全 -> 选择windwos defender -> 点击添加排除项&#xff0c;将指定的文件或目录排除&#xff0c;避免被软件删除 允许…...

基于Python实现一个庆祝国庆节的小程序

功能&#xff1a; 添加互动功能&#xff1a;允许用户选择不同的祝福语或者查询不同的国庆节信息。动态背景音乐&#xff1a;播放国庆节相关的背景音乐。增加节日小测验&#xff1a;提供一些关于国庆节的趣味小测验&#xff0c;让用户参与。增强图形用户界面 (GUI)&#xff1a;…...

Anaconda 安装与使用教程

Anaconda 安装与使用教程 介绍 Anaconda 是一个用于科学计算的 Python 和 R 的发行版&#xff0c;它包含了众多流行的科学计算、数据分析、机器学习等领域的库。本教程旨在帮助初学者快速上手 Anaconda&#xff0c;并学会如何使用其管理环境以及安装包。 第一步&#xff1a;…...

新手必看!Qwen3-4B-Instruct-2507从部署到对话:vLLM+Chainlit全步骤解析

新手必看&#xff01;Qwen3-4B-Instruct-2507从部署到对话&#xff1a;vLLMChainlit全步骤解析 1. 模型介绍与准备工作 1.1 Qwen3-4B-Instruct-2507核心优势 Qwen3-4B-Instruct-2507是阿里巴巴推出的轻量级大语言模型&#xff0c;专为指令跟随任务优化。相比前代版本&#x…...

Cadence 617 + TSMC 18RF工艺库:手把手教你从仿真曲线中提取MOSFET核心参数(附Python脚本)

Cadence 617 TSMC 18RF工艺库&#xff1a;从仿真曲线自动化提取MOSFET参数的Python实践 在模拟IC设计领域&#xff0c;工艺参数的准确提取直接影响电路性能预测的可靠性。传统手动选点计算Vth、μCox等参数的方法不仅效率低下&#xff0c;还容易引入人为误差。本文将演示如何通…...

新手必看!手把手教你搭建微调大模型环境,附硬件配置与工具链教程

本文详细介绍了微调大模型的环境搭建与工具链配置&#xff0c;包括硬件要求&#xff08;不同模型所需显存及推荐显卡&#xff09;、核心依赖安装&#xff08;transformers、peft、bitsandbytes等&#xff09;、Hugging Face生态速览&#xff08;模型、数据集、Trainer&#xff…...

电源环路分析仪不会用?2026年硬件工程师的必备技能该补上了

电源环路分析仪不会用&#xff1f;2026年硬件工程师的必备技能该补上了实验室里,Buck电源刚调通,输出纹波看着也不错,但一上动态负载,输出电压就开始剧烈振荡。换了几组补偿参数,还是没找到症结所在。这时候,旁边有经验的前辈说了一句:"你测过环路稳定性吗?"说实话,…...

搜索引擎优化(SEO)对网站排名有什么影响

搜索引擎优化(SEO)对网站排名有什么影响 在当今互联网时代&#xff0c;拥有一个成功的网站不仅仅是建立一个美观的网页&#xff0c;更重要的是让这个网站在搜索引擎中获得高排名。搜索引擎优化&#xff08;SEO&#xff09;正是为了解决这个问题&#xff0c;让你的网站能够在大…...

Latex写论文必看:如何从谷歌学术获取完整的BibTeX引用信息(含Springer/Elsevier/IEEE案例)

LaTeX论文写作进阶&#xff1a;精准获取BibTeX引用数据的全流程指南 作为科研工作者&#xff0c;我们都经历过这样的场景&#xff1a;深夜赶论文时&#xff0c;发现从谷歌学术导出的BibTeX条目缺少关键字段&#xff0c;特别是那些期刊要求的卷号(number)、页码或DOI信息。这种…...

UE5 Windows打包Linux报错?手把手教你搞定交叉编译和.NET SDK配置

UE5 Windows打包Linux报错终极解决方案&#xff1a;从交叉编译到.NET SDK配置全流程指南 当你兴奋地在Windows上使用Unreal Engine 5准备为Linux平台打包游戏时&#xff0c;突然遭遇"The SDK for Windows is not installed properly"的报错&#xff0c;这种挫败感我…...

YOLOE开源镜像生产环境部署:YOLOE-v8m-seg在Docker Swarm集群实践

YOLOE开源镜像生产环境部署&#xff1a;YOLOE-v8m-seg在Docker Swarm集群实践 1. 引言&#xff1a;从单机到集群的跨越 如果你已经体验过YOLOE官版镜像在单台服务器上的强大能力&#xff0c;比如用文本描述就能识别图片里的任何物体&#xff0c;或者用一张示例图就能完成精准…...

数字游民工作流:OpenClaw+千问3.5-27B自动处理跨境邮件

数字游民工作流&#xff1a;OpenClaw千问3.5-27B自动处理跨境邮件 1. 为什么需要自动化邮件处理 作为数字游民&#xff0c;我每天需要处理来自不同时区的客户邮件。这些邮件往往混杂着英语、西班牙语和中文&#xff0c;且包含大量模糊的需求描述。最痛苦的是凌晨三点被手机提…...

Windows下OpenClaw安装指南:快速接入SecGPT-14B安全模型

Windows下OpenClaw安装指南&#xff1a;快速接入SecGPT-14B安全模型 1. 为什么选择OpenClawSecGPT-14B组合 去年我在做安全日志分析时&#xff0c;每天要手动检查数百条告警&#xff0c;直到发现OpenClaw这个能直接操控本地电脑的AI智能体框架。配合专门训练的安全大模型SecG…...