Java spring MVC环境中实现WebSocket的示例代码

 更新时间:2023年09月28日 15:28:50   作者:深圳市有德者科技有限公司  
这篇文章主要介绍了Java spring MVC环境中实现WebSocket,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

我们先在项目 pom.xml 中注入websocket依赖

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

然后 我们在 配置文件中加一下配置
我这里用的是yml
参考代码如下

server:
  port: 80
spring:
  cors:
    allowed-origins: "*"
    allowed-headers: "*"
  websocket:
    enabled: true
    endpoint: /ws
    path: /websocket
    max-text-message-size: 256KB
    max-binary-message-size: 256KB

端口 80然后 将请求源 和 请求头信息 设置为星号 表示 不限制 这样就不会发生跨域然后 打开websocket配置限制信息大小

然后 找到启动类 目录下面创建一个 config文件夹 用来写配置文件

然后 在这个目录下面创建一个 MyWebSocketHandler.java参考代码如下

import org.springframework.web.socket.CloseStatus;
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.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class MyWebSocketHandler extends TextWebSocketHandler {
    private static final List<WebSocketSession> sessions = new ArrayList<>();

    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        // 建立连接时触发
        sessions.add(session);
        System.out.println(sessions);
    }

    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        System.out.println(session.getId());
        // 处理收到的消息
        String payload = message.getPayload();
        System.out.println(payload);
        System.out.println(sessions);
        List<WebSocketSession> filteredSessions = sessions.stream()
                .filter(item -> session.getId() != item.getId())
                .collect(Collectors.toList());
        for (WebSocketSession webSocketSession : filteredSessions) {
            try {
                webSocketSession.sendMessage(new TextMessage(payload)); // 推送给前端的字符串
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        // ...
    }

    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        // 关闭连接时触发
        sessions.remove(session);
    }
}

这个类中写了websocket的基本配置
首先是 建立连接时触发 afterConnectionEstablished
这个函数接收一个参数 就是当前连进来的web应用 这个对象中就是 web端的url和websocket给的唯一 连接id
然后 我们用sessions 这个list集合 将连接的信息存起来

然后handleTextMessage 当web端发来数据时触发
接收两个参数 session 告诉我们是谁发的
message 发来的信息
我们通过

String payload = message.getPayload();

接收信息
然后 输出在控制台
然后 我们通过filter对sessions进行过滤
简单说 条件就是 除了发信息的人 其他都过滤出来

然后 我们通过

for (WebSocketSession webSocketSession : filteredSessions) {
    try {
        webSocketSession.sendMessage(new TextMessage(payload)); // 推送给前端的字符串
    } catch (IOException e) {
        e.printStackTrace();
    }
}

首先 我们循环过滤好的list集合
然后一个一个的去发送消息sendMessage
这个就是 连接对象.sendMessage(new TextMessage(要发的信息))

然后 afterConnectionClosed 当有应用断开连接时触发 session 告诉你是谁断开了

然后 我们在这个目录下创建一个 WebSocketConfig.java
参考代码如下

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;
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(new MyWebSocketHandler(), "/websocket").setAllowedOrigins("*");
    }
}

这里 我们实现 WebSocketConfigurer 接口 重写registerWebSocketHandlers
调用我们自己写的 MyWebSocketHandler配置

然后 我们启动项目

在写个vue的WebSocket 来测试连接一下

在写个vue的WebSocket 来测试连接一下

这里 我们看到 前端建立连接成功

而java控制台 也输出了我们连接对象的格式 一个连接id 和一个url

然后 这是我的vue代码

<template>
  <div>
       <input
        type="text"
        v-model="text"
        placeholder="请输入内容"
      ></input>
      <button @click = "sendData">发送消息</button>
      <div v-for = "(item,index) in list" :key = "index">{{ item }}</div>
  </div>
</template>
<script>
export default {
  data() {
    return {
      ws: null,
      text: "",
      list: []
    };
  },
  methods: {
    sendData() {
        this.ws.send(this.text)
    }
  },
  mounted() {
      this.ws = new WebSocket('ws://localhost/websocket');
      this.ws.onopen = () => {
        console.log('WebSocket连接已建立');
      };
      this.ws.onmessage = (event) => {
        this.list.push(event.data);
      };
      this.ws.onclose = () => {
        console.log('WebSocket连接已关闭');
      };
      this.ws.onerror = (error) => {
        console.log('WebSocket错误:', error);
      };
  }
};
</script>

大家可以自己开两个创建试试这个聊天效果 还是挺好玩的

到此这篇关于Java spring MVC环境中实现WebSocket的文章就介绍到这了,更多相关java实现WebSocket内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解mybatis.generator配上最新的mysql 8.0.11的一些坑

    详解mybatis.generator配上最新的mysql 8.0.11的一些坑

    这篇文章主要介绍了详解mybatis.generator配上最新的mysql 8.0.11的一些坑,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Java Web关键字填空示例详解

    Java Web关键字填空示例详解

    最近在工作中使用了java web,发现有些难度,下面这篇文章主要给大家介绍了关于Java Web关键字填空的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-04-04
  • Spring boot 连接多数据源过程详解

    Spring boot 连接多数据源过程详解

    这篇文章主要介绍了Spring boot 连接多数据源过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08
  • Java参数校验详解之使用@Valid注解和自定义注解进行参数验证

    Java参数校验详解之使用@Valid注解和自定义注解进行参数验证

    在后端开发中,参数校验是非常普遍的,下面这篇文章主要给大家介绍了关于Java参数校验详解之使用@Valid注解和自定义注解进行参数验证的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-06-06
  • java  BASE64Encoder详细介绍及简单实例

    java BASE64Encoder详细介绍及简单实例

    这篇文章主要介绍了java BASE64Encoder详细介绍及简单实例的相关资料,需要的朋友可以参考下
    2017-01-01
  • Java多线程模式之Balking模式详解

    Java多线程模式之Balking模式详解

    这篇文章主要介绍了Java多线程模式之Balking模式,结合实例形式较为详细的分析了Balking模式的原理、用法与相关注意事项,需要的朋友可以参考下
    2017-06-06
  • Java基于ServletContextListener实现UDP监听

    Java基于ServletContextListener实现UDP监听

    这篇文章主要介绍了Java基于ServletContextListener实现UDP监听,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • SpringBoot实现微信小程序支付功能

    SpringBoot实现微信小程序支付功能

    小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-04-04
  • 利用IDEA社区版创建SpringBoot项目的详细图文教程

    利用IDEA社区版创建SpringBoot项目的详细图文教程

    大家应该都知道Idea社区版本,默认是不能创建SpringBoot项目的,下面这篇文章主要给大家介绍了关于利用IDEA社区版创建SpringBoot项目的详细图文教程,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-04-04
  • SpringBoot启动时执行初始化操作的几种方式

    SpringBoot启动时执行初始化操作的几种方式

    项目中,经常需要在启动过程中初始化一些数据,如从数据库读取一些配置初始化,或从数据库读取一些热点数据到redis进行初始化缓存,本文给大家介绍了SpringBoot启动时执行初始化操作的几种方式的相关资料,需要的朋友可以参考下
    2024-05-05

最新评论