Websocket在Java中的实践——最小可行案例

大纲

  • 最小可行案例
    • 依赖
    • 开启Websocket,绑定路由
    • 逻辑类
  • 测试
  • 参考资料

WebSocket是一种先进的网络通信协议,它允许在单个TCP连接上进行全双工通信,即数据可以在同一时间双向流动。WebSocket由IETF标准化为RFC 6455,并且已被W3C定义为JavaScript API的标准,成为现代浏览器的重要特性之一。
WebSocket的引入彻底改变了传统的Web应用交互模式。在WebSocket之前,Web应用通常使用HTTP协议进行通信,但由于HTTP是一个无状态的、请求-响应模式的协议,它无法满足实时、双向通信的需求。WebSocket的出现,解决了这一问题,它使得Web应用能够像桌面应用一样,实现低延迟、高频率的数据交换。
WebSocket的核心特性包括:

  • 全双工通信:WebSocket允许客户端和服务器之间进行双向通信,数据可以在同一时间双向流动。这意味着服务器可以主动向客户端推送数据,而无需等待客户端发起请求。
  • 长连接:WebSocket连接一旦建立,就会保持打开状态,直到显式关闭。这种长连接特性减少了频繁建立和销毁连接的开销,提高了通信效率。
  • 轻量级头部:WebSocket数据帧采用紧凑的二进制格式,减少了不必要的头部信息,提高了数据传输效率。
  • 实时性:由于数据可以直接在已建立的连接上传输,WebSocket能够实现实时或接近实时的数据交互。
  • 跨域支持:与HTTP一样,WebSocket也允许跨域通信,只需服务器端设置相应的CORS(跨源资源共享)头即可。

通过本系列学习,我们会缩减《RabbitMQ实践——搭建多人聊天服务》一文中的接口,在一个连接上实现消息的收发。

最小可行案例

依赖

在pom.xml中新增

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

开启Websocket,绑定路由

src\main\java\com\nyctlc\front\config\WebSocketConfig.java

package com.nyctlc.front.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.EnableWebSocket;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;import com.nyctlc.front.handler.WebSocketHandler;@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {@Overridepublic void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {registry.addHandler(new WebSocketHandler(), "/websocket").setAllowedOrigins("*");}
}

@EnableWebSocket 是 Spring Boot 中的一个注解,它主要用于启用对 WebSocket 的支持。
我们通过WebSocketHandlerRegistry的addHandler方法,将/websocket接口的处理逻辑交由自定义的WebSocketHandler类处理;同时使用setAllowedOrigins来表示接受所有的域过来的请求。

逻辑类

src\main\java\com\nyctlc\front\handler\WebSocketHandler.java

package com.nyctlc.front.handler;import org.springframework.web.socket.TextMessage;
import org.springframework.web.socket.WebSocketSession;
import org.springframework.web.socket.handler.TextWebSocketHandler;import java.io.IOException;
import java.util.HashSet;
import java.util.Set;public class WebSocketHandler extends TextWebSocketHandler {private static Set<WebSocketSession> sessions = new HashSet<>();@Overridepublic void afterConnectionEstablished(WebSocketSession session) throws Exception {sessions.add(session);}@Overrideprotected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {for (WebSocketSession webSocketSession : sessions) {if (webSocketSession.isOpen()) {try {webSocketSession.sendMessage(message);} catch (IOException e) {e.printStackTrace();}}}}
}

当连接建立后,afterConnectionEstablished会被调用,我们将连接保存到sessions集合中。这一步主要是为了后续给各个连接发送请求用。
handleTextMessage表示收到了请求,然后会遍历所有连接,并会对处于Open状态的连接发送收到的消息。这儿就是收发放在一起了。

测试

我在网页中用JS做了各种测试,会发现遇到很多问题。后来索性采用Postman来测试,亲测可行且稳定。
在这里插入图片描述

填入我们绑定的地址:ws://localhost:8080/websocket
在这里插入图片描述
下图可见连接上了
在这里插入图片描述
我们发送一条hello
在这里插入图片描述
可以看到接受到了服务端的反馈
在这里插入图片描述

参考资料

  • https://medium.com/@ropelife/real-time-communication-with-websocket-in-spring-boot-using-webflux-5d9fbb36a0ab

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

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

相关文章

C++ | Leetcode C++题解之第204题计数质数

题目&#xff1a; 题解&#xff1a; class Solution { public:int countPrimes(int n) {vector<int> primes;vector<int> isPrime(n, 1);for (int i 2; i < n; i) {if (isPrime[i]) {primes.push_back(i);}for (int j 0; j < primes.size() && i …

深入解析:如何在 Postman 中添加请求的 Body 数据

在现代软件开发中&#xff0c;API 测试是一个不可或缺的环节&#xff0c;而 Postman 作为一款流行的 API 开发工具&#xff0c;它提供了丰富的功能来帮助开发者测试和调试 API。其中&#xff0c;添加请求的 Body 数据是发送 POST 或 PUT 请求时的一个常见需求。本文将详细讲解如…

【建设方案】工单系统建设方案(Word原件)

工单管理系统解决方案 1、工单创建&#xff1a;根据告警信息创建工单。 2、工单管理&#xff1a;列表形式展示所有工单信息及进度状态。 3、工单处理&#xff1a;对接收的工单进行处理反馈。 4、工单催办&#xff1a;根据工单时效自动发送工单催办消息通知。 5、工单归档&#…

Allegro如何单独导出一个封装?

Allegro如何单独导出一个封装? Allegro如何导出封装? 在用Allegro进行PCB设计时,有时候需要从其它的项目中导出需要的封装,但一般情况下不需要全部的封装,只需要其中的某一个封装,那么怎么导出呢? 具体操作方法如下 首先需要在Allegro的安装目录下安装两个文件。(文件附…

css 流动边框

一、背景流动边框 实现原理&#xff1a; 用背景进行旋转&#xff0c;超出我们想显示的范围则hidden&#xff0c;就有以上的效果&#xff0c;可以用after或者before元素来实现也可以。 <!DOCTYPE html> <html lang"en"><head><meta charset&qu…

Ubuntu-22.04 安装Confulence

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

第四节:如何使用注解方式从IOC中获取bean(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;上一节学习了如何理解Spring的两个特性IOC和AOP&#xff0c;这一节来基于上节的内容进行一个简单实践。这节要实现的效果是通过IOC容器获取到Bean&#xff0c;并且将Bean的属性显示打印出来。 第一步&#xff1a;创建pojo实体类stu…

操作系统之《处理器机调度算法》【知识点+详细解题过程】

目录 PS:处理机调度算法相关公式&#xff1a; 1、【FCFS】先来先服务调度算法 2、【SJF&#xff08;SPF&#xff09;】短作业&#xff08;进程&#xff09;优先调度算法 3、【HRRF】最高响应比优先算法 4、【SRTF】最短剩余时间优先调度算法&#xff08;抢占式&am…

SpringCloudAlibaba基础四 微服务调用组件OpenFeign

JAVA 项目中如何实现接口调用&#xff1f; 1&#xff09;Httpclient HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 …

COB显示屏厂家为您详细解析COB显示屏的制造流程

倒装COB显示屏所采用的工艺与传统SMD LED显示屏完全不同&#xff0c;其是直接把LED发光芯片封装于PCB基板之上&#xff0c;因此其能够提供更小的像素间距&#xff0c;并且产品表面覆盖有高分子材料涂层&#xff0c;能够增强产品的防磕碰能力以及防水能力&#xff0c;在之前的文…

2741. 特别的排列 Medium

给你一个下标从 0 开始的整数数组 nums &#xff0c;它包含 n 个 互不相同 的正整数。如果 nums 的一个排列满足以下条件&#xff0c;我们称它是一个特别的排列&#xff1a; 对于 0 < i < n - 1 的下标 i &#xff0c;要么 nums[i] % nums[i1] 0 &#xff0c;要么 nums[…

STM32开发方式的演变与未来展望

一、STM32开发方式的演变 自2007年STM32微控制器首次亮相以来&#xff0c;其开发方式经历了从寄存器到标准库&#xff0c;再到HAL&#xff08;硬件抽象层&#xff09;的演变。 1.寄存器开发&#xff08;2007年-2010年代初&#xff09; 最初&#xff0c;由于初期缺乏足够的软…

使用AI的100种方法#翻译神器N3

Text "100 ways to" and "use AI" in the poster center .A cozy desk setup with an open notebook featuring notes and drawings, a cup of coffee, a white pen, and dried flowers. Warm, earthy tones create a calming, aesthetic vibe. 第 3 种可能…

uniapp canvas vue3 ts实例

<template><view><canvas canvas-idcanvas-test class"canvas-test"></canvas></view> </template><script setup lang"ts">//封装的jsimport libs from /libs;//重点引入的import type { ComponentInternalIns…

【数学建模】 复杂网络与图论模型

文章目录 复杂网络与图论模型1. 复杂网络概念与理论1.1 复杂网络中的基本概念1.2 复杂网络中的统计指标 2. 图论算法&#xff1a;遍历&#xff0c;二分图与最小生成树2.1 图的遍历算法深度优先搜索&#xff08;DFS&#xff09;广度优先搜索&#xff08;BFS&#xff09; 2.2 二分…

Postman接口测试工具的原理及应用详解(六)

本系列文章简介&#xff1a; 在当今软件开发的世界中&#xff0c;接口测试作为保证软件质量的重要一环&#xff0c;其重要性不言而喻。随着前后端分离开发模式的普及&#xff0c;接口测试已成为连接前后端开发的桥梁&#xff0c;确保前后端之间的数据交互准确无误。在这样的背景…

[ruby on rails]rails6.0升级6.1

1.准备工作 在开始升级过程之前&#xff0c;我们有一些建议的准备工作。 升级的时候&#xff0c;最好一个版本一个版本升级&#xff0c;比如6.0到6.1再到7.0&#xff0c;不要一次从6.0到7.0至少80%的测试覆盖率&#xff0c;测试真的很重要&#xff0c;能确保升级快速完成。本…

SpringCloud - 微服务

SpringCloud 是一个用于构建微服务的开源框架&#xff0c;它提供了一系列用于微服务架构的工具和组件&#xff0c;包括服务注册与发现、负载均衡、熔断器、路由等1。以下是关于 SpringCloud 的详细介绍&#xff1a; 1. 服务注册与发现&#xff1a;SpringCloud 提供了服务注册与…

【每日一练】python运算符

1. 算术运算符 编写一个Python程序&#xff0c;要求用户输入两个数&#xff0c;并执行以下运算&#xff1a;加法、减法、乘法、求余、除法、以及第一个数的第二个数次方。将结果打印出来。 a input("请输入第一个数&#xff1a;") b input("请输入第二个数&…

Word中输入文字时,后面的文字消失

当在Word中输入文字时&#xff0c;如果发现后面的文字消失&#xff0c;通常是由以下3个原因造成的&#xff1a; 检查Insert键状态&#xff1a;首先确认是否误按了Insert键。如果是&#xff0c;请再次按下Insert键以切换回插入模式。在插入模式下&#xff0c;新输入的文字会插入…