首页 > 其他分享 >基于SpringMVC搭建WebSocker

基于SpringMVC搭建WebSocker

时间:2023-06-30 11:14:09浏览次数:40  
标签:web WebSocker SpringMVC springframework session org import public 搭建

SpringMVC的搭建请参考我以前的文章

1.添加pom依赖

本文使用最新的Spring6,一些依赖的问题需要自行解决

    <!-- 添加socket支持 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-websocket</artifactId>
      <version>6.0.10</version>
    </dependency>

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-messaging</artifactId>
      <version>6.0.10</version>
    </dependency>

2.添加Socket Handler,用于处理Socker消息的请求和发送。

package cn.coreqi.handler;

import org.springframework.web.socket.*;

import java.util.concurrent.ConcurrentHashMap;

/**
 * 创建WebSocketHandler的实现类
 * Spring提供了AbstractWebSocketHandler类、TextWebSocketHandler类、BinaryWebSocketHandler类,看自己需求进行继承。
 * 该类主要是用来处理消息的接收和发送
 */
public class MyWebSocketHandler implements WebSocketHandler {

    //保存用户链接
    private static ConcurrentHashMap<String, WebSocketSession> users = new ConcurrentHashMap<String, WebSocketSession>();

    //连接就绪时
    @Override
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        users.put(session.getId(), session);
    }

    //处理消息
    @Override
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
        System.err.println(session + "---->" + message + ":"+ message.getPayload().toString());
        // message.getPayload().toString() 获取消息具体内容
        String msg = message.getPayload().toString();
        System.out.println("handleMessage......." + msg + "..........." + msg);
        // 处理消息 msgContent消息内容
        TextMessage textMessage = new TextMessage(msg, true);
        //session.sendMessage(message);
        // 调用方法(发送消息给所有人)
        sendMsgToAllUsers(textMessage);
    }

    //处理传输时异常
    @Override
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        if(session.isOpen()){
            session.close();
        }
        System.err.println("websocket chat connection closed......");
        users.remove(session.getId());
    }

    //关闭连接时
    @Override
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception {
        System.out.println("用户: " + session.getRemoteAddress() + " is leaving, because:" + closeStatus);
        users.remove(session.getId());
    }

    //是否支持分包
    @Override
    public boolean supportsPartialMessages() {
        return false;
    }

    //给所有用户发送消息
    public void sendMsgToAllUsers(WebSocketMessage<?> message) throws Exception{
        for (WebSocketSession user : users.values()) {
            user.sendMessage(message);
        }
    }
}

3.添加Socket Interceptor,用于拦截握手前和握手后的一些操作

package cn.coreqi.interceptor;

import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;

import java.util.Map;

/**
 * 握手拦截器,继承HttpSessionHandshakeInterceptor类,也可以实现HandshakeInterceptor接口
 * 这个的主要作用是可以在握手前做一些事,把所需要的东西放入到attributes里面,然后可以在WebSocketHandler的session中取到相应的值,具体可参考HttpSessionHandshakeInterceptor
 */
public class MyHandshakeInterceptor extends HttpSessionHandshakeInterceptor {

    /**
     * 在调用handler前处理方法。常用在注册用户信息,绑定WebSocketSession,在handler里根据用户信息获取WebSocketSession发送消息。
     * @param request
     * @param response
     * @param wsHandler
     * @param attributes
     * @return
     * @throws Exception
     */
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
        System.out.println("++++++++++++++++ HandshakeInterceptor: beforeHandshake  ++++++++++++++" + attributes);
        return super.beforeHandshake(request, response, wsHandler, attributes);
    }

    //握手后
    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
        System.out.println("++++++++++++++++ HandshakeInterceptor: afterHandshake  ++++++++++++++");
        super.afterHandshake(request, response, wsHandler, ex);
    }
}

4.添加WebSocker配置类,用于指定路由与处理类及拦截器的映射关系

package cn.coreqi.config;

import cn.coreqi.handler.MyWebSocketHandler;
import cn.coreqi.interceptor.MyHandshakeInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.WebSocketHandler;
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 org.springframework.web.socket.server.HandshakeInterceptor;
import org.springframework.web.socket.server.standard.ServletServerContainerFactoryBean;

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {

    /**
     * 配置websocket入口,允许访问的域、注册Handler、SockJs支持和拦截器
     * @param registry
     */
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {

        //允许连接的域,只能以http或https开头
        String[] allowsOrigins = {"http://localhost:8080"};


        //前台 可以使用websocket环境
        //registry.addHandler注册和路由的功能,当客户端发起websocket连接,把/path交给对应的handler处理
        registry.addHandler(myWebSocketHandler(),"/coreqi")
                .addInterceptors(myInterceptor())
                .setAllowedOrigins(allowsOrigins);

        //前台 不可以使用websocket环境,则使用sockjs进行模拟连接
        registry.addHandler(myWebSocketHandler(), "/sockjs/coreqi")  //配置路径对应的处理类
                .addInterceptors(myInterceptor())   //配置拦截器
                .setAllowedOrigins(allowsOrigins)   //允许连接的域
                .withSockJS();  //提供SockJs支持
    }

    // websocket 拦截器
    @Bean
    public HandshakeInterceptor myInterceptor(){
        return new MyHandshakeInterceptor();
    }

    // websocket 处理类
    @Bean
    public WebSocketHandler myWebSocketHandler(){
        return new MyWebSocketHandler();
    }

    @Bean
    public ServletServerContainerFactoryBean createWebSocketContainer() {
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        container.setMaxTextMessageBufferSize(8192);
        container.setMaxBinaryMessageBufferSize(8192);
        return container;
    }
}

5.测试

image

标签:web,WebSocker,SpringMVC,springframework,session,org,import,public,搭建
From: https://www.cnblogs.com/fanqisoft/p/17516087.html

相关文章

  • .net6搭建websocket
    当使用.NET6构建WebSocket微服务时,可以按照以下步骤进行操作:1.创建新的.NET6项目:打开适用于.NET6的IDE(如VisualStudio2022或VisualStudioCode),创建一个新的空白项目。.net6默认引入了Microsoft.AspNetCore.WebSockets2,3步骤省略2.添加WebSocket支持:确保项目引用了`Mi......
  • 海外视频直播源码技术视频直播间的搭建
        在科技日渐发达的当今,网络将天南海北的连接到了一起,让人们之间的距离缩短,这其中就有一个技术它既把人们聚在一起,又可以让人们在其中进行社交,这个技术是什么那?听我往下面说。在一个源码平台中,有这么一个房间,他由一个人进行开始并主持,进入房间几乎没有限制,但大部分人都作......
  • MongoDB从入门到实战之.NET Core使用MongoDB开发ToDoList系统(8)-Ant Design Blazor前端
    前言前面的章节我们介绍了一些值得推荐的BlazorUI组件库,通过该篇文章的组件库介绍最终我选用AntDesignBlazor这个UI框架作为ToDoList系统的前端框架。因为在之前的工作中有使用过AntDesignVue、AntDesignAngular习惯并且喜欢AntDesign设计规范和风格,废话不多说今天我......
  • redis cluster集群搭建
    redis6.2使用docker搭建rediscluster集群(3主3从)所有的操作都在根目录~/Developer/docker-compose/redis-cluster-6.2执行创建配置文件为了方便,写了个shell脚本,懒人必备createConfig.shforportin$(seq63816386);doconf_dir=./${port}/confconf_file=$......
  • react保姆级搭建新项目
    此文主要以ts+vite+router6+antd快速搭建一个react项目,适用于初学者一、项目搭建采用pnpm,个人感觉比npm和yarn好用npmipnpm-g采用vite方式,根据选择react-tspnpmcreatevite1.1修改初始结构,删除多余文件1.2修改vite.config配置文件配置别名vite.config:import{defineC......
  • Flutter私服搭建之package查询
    温馨提示:这是一篇私有的package客户端查询的平台搭建文章,牵扯到python中的Django框架,虽和Flutter相关,但客户端的代码并没有关联,请您根据需要进行阅读。公有的package,对于一个Flutter开发者而言,再熟悉不过,比如常见的网络库dio,存储库shared_preferences等等,我们都可以在官网进行查找......
  • pytest接口自动化测试框架搭建的全过程
    pytest是Python的一种单元测试框架,可用来组织用例执行,用例断言,下面这篇文章主要给大家介绍了关于pytest接口自动化测试框架搭建的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下一.背景Pytest目前已经成为Python系自动化测试必学必备的一个框架,网上也有很多......
  • Day05 5.1 Java环境搭建
    Day055.1Java环境搭建【一】Jdk的安装和配置【1】安装jdk是否需要再选择安装一个额外的JRE。这是可选的,因为之前安装的JDK中,已经包含了开发环境和JRE运行环境两部分,所以不必再安装一个JRE。【2】配置环境变量(1)新建JAVA_HOMEJAVA_HOMED:\ProgramFiles\Java\jdk-1......
  • 2. SpringMVC入门案例
    1.入门案例之创建步骤‍SpringMVC的制作过程和上述流程几乎是一致的,具体的实现流程是什么?1.创建web工程(Maven结构)2.设置tomcat服务器,加载web工程(tomcat插件)3.导入坐标(SpringMVC+Servlet)4.定义处理请求的功能类(UserController)5.设置请求映射(配置映射关......
  • 嵌入式-Qt开发环境搭建
    1.什么是QTSDK,QT,QTCreator(1)QTSDK包括QT库,QTCreator(IDE),QT工具(qmake等,qmake用于生产Makefile)(2)QT是基于C++的跨平台的应用程序框架,可以认为是一个库文件(3)QTCreator一款IDE2.搭建嵌入式-QT开发环境需要什么(1)QTCreator 一般在虚拟机的Li......