WebSocket全双工通信SpringBoot实现

news/2025/1/11 14:20:19/

【IT老齐238】十分钟上手WebSocket全双工通信协议_哔哩哔哩_bilibili【IT老齐238】十分钟上手WebSocket全双工通信协议, 视频播放量 8348、弹幕量 23、点赞数 318、投硬币枚数 157、收藏人数 257、转发人数 30, 视频作者 IT老齐, 作者简介 老齐的个人V: itlaoqi001 ~~欢迎前来交流,相关视频:基于redis订阅消息和websocket技术实现的消息推送功能,【websocket】【前端】保证前端实时性的技术:websocket,43 Spring Boot整合WebSocket详解,SpringBoot WebSocket Echarts 服务器实时向客户端推送数据,12分钟搞定基于websocket,springboot,vue的简单聊天室。,WebFlux如何使用SSE做服务端的定向推送,springboot快速接入webSocket(心跳连接)- RuoYi-Vue-Plus系列教程,SpringBoot系列-Websocket 实时聊天,socket和websocket有什么区别?,【WebSocket通信】网络聊天室在线聊天系统___搭建自己的即时聊天室 WebSocket+Vue网络聊天室在线聊天系统毕业源码案例设计https://www.bilibili.com/video/BV1Kd4y1w7JR/?spm_id_from=333.337.search-card.all.click&vd_source=3b2d00a63e8d4ae7dea36274e5447a45

一、后端pom.xml引入依赖

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

二、启动类注入Bean

@SpringBootApplication
public class TtSdemoApplication {public static void main(String[] args) {SpringApplication.run(TtSdemoApplication.class, args);}@Beanpublic ServerEndpointExporter serverEndpointExporter() {return new ServerEndpointExporter();}
}

三、编写WebSocket类

package com.zj.ttsdemo.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;/*** Created by** @Author: JoyceZhang* @Date: 2023/05/25/15:28* @Description:*/
@Slf4j
@ServerEndpoint(value="/websocket")
@Component
public class Websocket {private static Session[] sessionContainer = new Session[2];/*** A,B与服务器建立连接*/@OnOpenpublic void onOpen(Session session) {if (sessionContainer[0] == null && sessionContainer[1] == null) {sessionContainer[0] = session;log.info("a连接成功");} else if (sessionContainer[0] != null && sessionContainer[1] == null) {sessionContainer[1] = session;log.info("b连接成功");} else {log.info("连接失败");}}/*** 链接关闭*/@OnClosepublic void onClose(Session session) {for(int i=0;i<sessionContainer.length;i++){if(sessionContainer[i] == session){sessionContainer[i] = null;log.info((i==0?"a":"b")+"断开连接");}}}/*** 得到另一个session对象*/private Session getOtherSession(Session session) {for(int i = 0; i<sessionContainer.length;i++){if(session == sessionContainer[i]){log.info("获取到另一个session");return sessionContainer[(i==0?1:0)];}}return null;}/*** 向另一个session发送消息*/@OnMessagepublic void sendMessage(String message,Session session) throws IOException{Session otherSession = this.getOtherSession(session);log.info("发送消息"+message+"到"+(otherSession==sessionContainer[0]?"a":"b"));otherSession.getBasicRemote().sendText(message);}/*** 异常处理*/@OnErrorpublic void onError(Session session, Throwable error) {log.error("发生错误");error.printStackTrace();}
}

四、编写测试页面

在resource/static目录下编写chat.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<input id = "text" type ="text">
<button onclick = "send()">Send</button>
<button onclick = "closeWebSocket()">Close</button>
<div id = "message"></div>
</body>
<script type="text/javascript">var websocket = null;//判断当前浏览器是否支持WebSocketif('WebSocket' in window){websocket = new WebSocket("ws://localhost:8083/websocket");}else{alert('Not support websocket')}//连接发生错误的回调方法websocket.onerror = function(){setMessageInnerHTML("服务器通信故障");};//连接成功建立的回调方法websocket.onopen = function(event){setMessageInnerHTML("与服务器通信成功");}//接收到消息的回调方法websocket.onmessage = function(event){setMessageInnerHTML(event.data);}//连接关闭的回调方法websocket.onclose = function(){setMessageInnerHTML("WebSocket连接关闭");}//监听窗口关闭事件,当窗口关闭时,主动去关闭websocket连接,防止连接还没断开就关闭窗口,server端会抛异常。window.onbeforeunload = function(){websocket.close();}//将消息显示在网页上function setMessageInnerHTML(innerHTML){document.getElementById('message').innerHTML += innerHTML + '<br/>';}//关闭连接function closeWebSocket(){websocket.close();}//发送消息function send(){var message = document.getElementById('text').value;websocket.send(message);}
</script>
</html>

五、通信测试


http://www.ppmy.cn/news/83666.html

相关文章

鳌图 AutoCapital:进化中的新型机构长什么样?

鳌图 AutoCapital 提供了一条新的产业投资思路。 数科星球原创 作者丨苑晶 编辑丨大兔 时代塑造个人&#xff0c;时代也会迭代出现新的投资机构。第一代投资人和投资机构&#xff0c;或是学成于美国或就职于投行&#xff1b;目前人民币基金越来越多出现了产业和投资双背景的…

详细介绍一下Go1.17 特性,优缺点以及需要改进的地方

Go1.17 是 Go 语言的一个重要版本,于2021年8月16日发布。这个版本包含了一些新的特性、改进和 bug 修复,下面对其进行详细介绍。 Go 编译器和工具链的速度得到了大幅度提升。在新版本中,新增的 SSA 后端可以使 Go 编译器的编译速度提升 20% 至 30%。并且在 Go 1.17 版本中,…

Android 12.0屏蔽掉SystemUI的某些通知提示音

1.概述 在12.0的系统开发中,在系统SystemUI中会发一些通知的声音,但是同时也会在开机的时候,会有一些通知的声音,特别是不想要的一些通知的声音, 这些对于产品还是有一些影响的,所以为了产品体验,就需要屏蔽掉一些开机的通知的声音 2.屏蔽某些通知的提示音的核心代码 …

uniapp沉浸式渐变状态栏

插件地址&#xff1a;沉浸式渐变状态栏 - DCloud 插件市场 标准用法 <v-headerview actionBarColor"#fac90f" titleColor"#ffffff" pageTitle这是标题 ><template v-slot:title><!--如需自定义标题&#xff0c;用这个slot自定义内容。否则…

【计算机网络】网络命令的使用

文章目录 一、实验目的二、实验工具三、实验要求四、实验过程01 ping 命令的使用应用1&#xff1a;验证本地计算机上是否正确安装了 TCP/IP 协议应用2&#xff1a;测试某个目的主机可达性应用3&#xff1a;键入 ping&#xff0c;查看 ping 的其他参数含义 02 netstat 命令的典型…

Ubuntu环境变量踩坑实录

用户级别的环境变量 .bash_profile.bash_login.bashrc 坑的原理&#xff1a; 1.当bash shell作为登录shell启动时&#xff08;比如用户登录系统时&#xff09;&#xff0c;首先会查找并执行/.bash_profile文件。如果这个文件不存在&#xff0c;那么它会尝试查找并执行/.bash_…

如何将文件制作成二维码

日常生活和工作中&#xff0c;为了让大家更方便的查阅文件&#xff0c;可将文件生成二维码&#xff0c;打印在通知书、会议要求&#xff0c;或是直接用“二维码”分享。通过草料二维码可以将多种类型的文件快速生成文件二维码&#xff0c;微信扫码查看即可查看和下载文件。 ● …

golang的thedevsaddam/govalidator验证规则

govalidator 验证库中支持的验证规则非常丰富&#xff0c;可以根据具体需求选择相应的规则。以下是一些常用的验证规则&#xff1a; required: 字段必填 numeric: 数字类型 alpha: 字母字符&#xff08;A-Z, a-z&#xff09; alpha_dash: 字母、数字、下划线和破折号字符 alpha…