WebSocket全双工通信SpringBoot实现

news2025/1/10 10:25:53

【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);
    }
   
    @Bean
    public 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与服务器建立连接
     */
    @OnOpen
    public 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("连接失败");
        }
    }

    /**
     * 链接关闭
     */
    @OnClose
    public 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发送消息
     */
    @OnMessage
    public 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);
    }

    /**
     * 异常处理
     */
    @OnError
    public 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;

    //判断当前浏览器是否支持WebSocket
    if('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.coloradmin.cn/o/567763.html

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

相关文章

kubernetes01

kubernetes基础 kubernetes介绍 Kubernetes是Google在2014年开源的一款容器集群系统&#xff0c;简称k8s Kubernetes用于容器化应用程序部署、扩展和管理&#xff0c;目标是让容器化应用简单高效 官方网站&#xff1a;https://kubernetes.io/ 官方文档&#xff1a;https://ku…

PFC(Priority Flow Control)及PFC Storm介绍

文章目录 PFCPFC Storm PFC PFC是一种流量控制机制&#xff0c;用于保证网络中的无损传输&#xff0c;常用于RDMA网络中&#xff0c;以下具体介绍其机制。 如图所示&#xff0c;发送方的出端口发送数据包给接收方的入端口。在发送方的出端口&#xff0c;数据包在至多八个队列中…

AI智能照片编辑:AI Photo for Mac

AI Photo是一款Mac平台上的智能照片编辑软件&#xff0c;它基于人工智能技术&#xff0c;可以帮助用户快速、轻松地对照片进行编辑和美化。AI Photo提供了多种智能修复和美化功能&#xff0c;包括自动调整色彩、对比度、亮度、清晰度等&#xff0c;使得照片的质量得到有效提升。…

二叉树:填充每个节点的下一个右侧节点指针(java)

leetcode116:填充每个节点的下一个右侧节点指针 leetcode原题链接&#xff1a;题目描述递归解法一递归方法二&#xff08;效率更高&#xff09;二叉树专题 leetcode原题链接&#xff1a; 116题&#xff1a;填充每个节点的下一个右侧节点指针 题目描述 给定一个 完美二叉树 &a…

【STL模版库】vector介绍及使用 {构造函数,迭代器,容量相关接口,增删查改;动态二维数组}

一、vector的介绍 vector是表示可变大小数组的序列容器。就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而且它…

Shell iptales防火墙设置

文章目录 Linux 防火墙1.Linux包过滤防火墙概述2.四表五链四表五链 3.规则链之间的匹配顺序主机型防火墙网络型防火墙 4.规则链内的匹配顺序 Linux 防火墙 1.Linux包过滤防火墙概述 Linux 系统的防火墙: IP信息包过滤系统&#xff0c;它实际上由两个组件netfilter 和 iptable…

029:Mapbox GL绘制铁路黑白交替的线段

第029个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载数据显示铁路标识的那种黑白交替的线段。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共94行)相关API参考:专栏目标示例效果 配置方式 1)…

湍流的数值模拟方法概述

湍流&#xff0c;又称紊流&#xff0c;是一种极其复杂、极不规则、极不稳定的三维流动。湍流场内充满着尺度大小不同的旋涡&#xff0c;大旋涡尺度可以与整个流畅区域相当&#xff0c;而小漩涡尺度往往只有流场尺度千分之一的数量级&#xff0c;最小尺度旋涡的尺度通过其耗散掉…

蓝桥杯--挖地雷

没有白走的路&#xff0c;每一步都算数&#x1f388;&#x1f388;&#x1f388; 题目&#xff1a; 已知有很多的地窖&#xff0c;每一个地窖中又藏着很多的地雷&#xff0c;每个地窖之间都存在着相连性&#xff0c;但是不是任意的地窖都是相连的&#xff0c;要求我们找出一次能…

技术干货 | 在 PostgreSQL 中设置查询超时

在 Navicat Monitor 3 监控工具中的查询分析器画面顶部&#xff0c;我们设置了一个图表&#xff0c;用以显示等待时间最长的查询&#xff1a; 能够标识出滞后的查询非常重要&#xff0c;因为它们可以让一切陷入瘫痪。 除了在标识出慢速查询并对其进行修复外&#xff0c;另一种…

【2023 · CANN训练营第一季】昇腾AI入门课(TensorFlow)第二章——TensorFlow模型迁移训练

1.AI模型开发基础知识入门 1.1具备Python编程经验 a.使用位置和关键字参数定义和调用函数 b.字典、列表、集合 (创建、访问和迭代) c.for循环&#xff0c; for具有多个迭代器变量的循环 (例如&#xff0c;for a,b in [(1,2),(3,4)]) d.if/else条件块和条件表达式 e.字符串格式…

Echarts绘制折线图,超简单,源码点击即可运行!【文末源码地址】

文章目录 前言Apache Echarts绘制基础折线图绘制带标记的折线图绘制多条折线图绘制带标签的折线图完整源码地址 前言 本文包含的代码仅为部分片段&#xff0c;完整源码有详细注释&#xff0c;可在文末领取&#xff01; 在当今数字化时代&#xff0c;数据可视化已成为一种必不…

day12 - 图像修复

在图像处理的过程中&#xff0c;经常会遇到图像存在多余的线条或者噪声的情况&#xff0c;对于这种情况我们会先对图像进行预处理&#xff0c;去除掉对图形内容有影响的噪声&#xff0c;在进行后续的处理。 本节实验我们介绍使用图像膨胀来处理图形的多余线条&#xff0c;进行…

web前端 --- CSS(03) -- 元素定位

元素定位&#xff1a;标签在页面中的位置问题 &#xff08;1&#xff09;分类 绝对定位&#xff1a;将需要的元素直接定位固定的位置 PS&#xff1a;绝对定位&#xff0c;必须指定一个相对点&#xff08;一般是父标签&#xff09;。相对的标签必须是相对定位或者绝对定位【重…

chatgpt赋能python:PythonSearchGroup-Python搜索小组

Python Search Group - Python搜索小组 如果你是一个Python程序员&#xff0c;或者对Python编程语言感兴趣&#xff0c;那么你一定听说过Python Search Group。Python Search Group是一个专注于Python搜索和搜索引擎的小组&#xff0c;他们致力于提供高效的Python搜索工具和搜…

【Netty】字节缓冲区 ByteBuf(七)(下)

文章目录 前言一、实现原理二、ByteBuf 的使用案例三、ByteBuf 的3种使用模式3.1 堆缓冲模式3.2 直接缓冲区模式3.3 复合缓冲区模式 总结 前言 回顾Netty系列文章&#xff1a; Netty 概述&#xff08;一&#xff09;Netty 架构设计&#xff08;二&#xff09;Netty Channel 概…

鸿蒙Hi3861问题解决-DevEco VSCode无法跳转

一、问题描述 使用Windows和Ubuntu混合编译下载&#xff0c;在windows下搭建VSCodeDevEco Device Tool环境。通过SSH远程Ubuntu系统进行代码修改与编译。 在VSCode中&#xff0c;Ctrl左键&#xff0c;无法跳转。按住Ctrl键&#xff0c;鼠标移到函数上&#xff0c;也不会有任何反…

Flink+hadoop部署及Demo

Hadoop集群高可用部署 下载hadoop包地址 https://dlcdn.apache.org/hadoop/common/hadoop-3.2.4/hadoop-3.2.4.tar.gz 上传并解压到3台服务器 配置3台主机的hosts和免密登录 1.修改.bash_profile vi .bash_profile # HADOOP_HOME export HADOOP_HOME/apps/svr/hadoop-3.2.…

一分钟掌握技术术语:API(接口)|电商平台API接口展示示例

很多产品经理在项目开发过程中经常听到&#xff1a;你调我这个接口就好了&#xff1b;这个功能你写个接口给我&#xff1b;有什么不懂的就看下API接口文档。 开发经常说的接口是什么意思呢&#xff1f;术语解释&#xff1a;API&#xff08;Application Programming Interface&a…

GPT虚拟直播Demo系列(一)|GPT接入直播间实现主播与观众互动

摘要 ChatGPT和元宇宙都是当前数字化领域中非常热门的技术和应用。结合两者的优势和特点&#xff0c;可以探索出更多的应用场景和商业模式。例如&#xff0c;在元宇宙中使用ChatGPT进行自然语言交互&#xff0c;可以为用户提供更加智能化、个性化的服务和支持&#xff1b;在Ch…