WebSocket--整合springboot

这篇具有很好参考价值的文章主要介绍了WebSocket--整合springboot。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

握手拦截器

WebSocket处理程序



HttpSessionHandshakelnterceptor (抽象类):   握手拦截器,在握手前后添加操作
AbstractWebSocketHandler (抽象类) :   WebSocket处理程序,监听连接前,连接中,连接后WebSocketConfigurer (接口):    配置程序,比如配置监听哪个端口,上面的握手拦截器,处理程序的使用

握手拦截器

 握手拦截器,在握手前后添加操作文章来源地址https://www.toymoban.com/news/detail-794992.html

//握手拦截器
@Component
@Slf4j
public class MyWsInterceptor extends HttpSessionHandshakeInterceptor {

    //用户开始连接
    @Override
    public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Map<String, Object> attributes) throws Exception {
        //从reuqest获取远程的地址
        log.info("{}==》开始握手", request.getRemoteAddress().toString());
        return super.beforeHandshake(request, response, wsHandler, attributes);
    }

    @Override
    public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, Exception ex) {
        //从reuqest获取远程的地址
        log.info("{}==》握手成功后的返回", request.getRemoteAddress().toString());
        super.afterHandshake(request, response, wsHandler, ex);
    }
}

WebSocket处理程序

//WebSocket处理程序
@Slf4j
@Component      //注入spring进来
public class MyWsHandler extends AbstractWebSocketHandler {
    //同样的,为了快速访问,使用map去取值
    private static Map<String, SessionBean> map;

    //县线程安全的Integer
    private static AtomicInteger clientIdMaker;



    static {
        map = new ConcurrentHashMap<>();
        clientIdMaker = new AtomicInteger(0);
    }

    @Override
    //连接建立后,保存session连接,保存在类对象map中
    public void afterConnectionEstablished(WebSocketSession session) throws Exception {
        super.afterConnectionEstablished(session);
        //返回并自增//半自定义操作
        SessionBean sessionBean = new SessionBean(session, clientIdMaker.getAndIncrement());
        map.put(session.getId(), sessionBean);

        //自定义操作
        //sb.append(map.get(session.getId()).getClientId() + "进入了群聊<br/>");
        //sengMessage(map);

    }

    @Override
    //收到消息
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
        super.handleTextMessage(session, message);
        //sb.append(map.get(session.getId()).getClientId() + ":传输的内容:" + message.getPayload() + "<br/>");
        //log.info(String.valueOf(sb));
        //sengMessage(map);
    }

    @Override
    //传输出现异常
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {
        log.info("传输出现异常");
        super.handleTransportError(session, exception);
        if (session.isOpen()) {
            log.info("传输出现异常,关闭session");
            session.close();
            map.remove(session.getId());
        }
    }


    @Override
    //连接关闭
    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {
        super.afterConnectionClosed(session, status);
        map.remove(session.getId());
        //Integer clientId = map.get(session.getId()).getClientId();
        //log.info("()==>连接关闭", clientId);
        //sb.append(clientId + "退出了群聊" + "<br/>");
        //sengMessage(map);

    }

    //实现定时任务
    @Scheduled(fixedRate = 2000)  //每隔多少秒执行定时任务
    public void sengMsg() throws IOException {
        //向每个客户端发送请求
        for (String s : map.keySet()) {                 //遍历对象
            map.get(s)                                  //或与session对象
                    .getWebSocketSession()              //获取session
                    .sendMessage(new TextMessage("测试心跳"));                     //发送任务
        }
    }

    static void sengMessage(Map<String, SessionBean> map) {
        for (String key : map.keySet()) {
            try {
                map.get(key).getWebSocketSession().sendMessage(new TextMessage(sb.toString()));
            } catch (IOException e) {
                e.printStackTrace();
                log.info(e.getMessage());
            }
        }
    }


}

配置类

@Configuration
@EnableWebSocket
public class MyWsConfig implements WebSocketConfigurer {

    @Resource
    private MyWsHandler handler;

    @Resource
    private MyWsInterceptor interceptor;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
        registry.addHandler(handler, "/myWs1")   //传入处理器,以及handler监听的地址
                .addInterceptors(interceptor)           //添加拦截器  注入自定义的握手拦截器
                .setAllowedOrigins("*");                //允许的源
    }
}

到了这里,关于WebSocket--整合springboot的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot整合WebSocket详细教程

    共开启两个页面,实现一对一聊天。 服务端代码:https://gitee.com/lianaozhe/springboot-websocket.git 导入相关依赖: WebSocketConfig配置类: WebSocket操作类: TestController测试接口类: test.html文件: 复制test.html文件为test2.html文件,将上面的userId由’20’改为’10’,后面测试使用。 运行服

    2024年02月01日
    浏览(38)
  • 【十六】springboot整合WebSocket(超详细)

     springboot篇章整体栏目:  【一】springboot整合swagger(超详细 【二】springboot整合swagger(自定义)(超详细) 【三】springboot整合token(超详细) 【四】springboot整合mybatis-plus(超详细)(上) 【五】springboot整合mybatis-plus(超详细)(下) 【六】springboot整合自定义全局异常处

    2023年04月09日
    浏览(30)
  • WebSocket整合springboot显示进度条

    SpringBoot整合WebScoket显示进度条 - 钟小嘿 - 博客园 对于大文件上传解析,若直接上传,会超时,可使用WebSocket长链接方式实时显示文件的上传状态,实际上是从文件上传到内容解析完成存入数据库的过程,各个阶段的进度可自定义。 本文使用SpringBoot+WebSocket+vue2.0+Element+nginx实

    2024年02月14日
    浏览(35)
  • springboot整合websocket(详解、教程、代码)

    大家好,我是酷酷的韩~ 1.websocket定义 WebSocket协议是基于TCP的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。websocket 协议是在 http 协议上的一种补充协议,是 html5 的新特性,是一种持久化的协议。 2.websocket工作原理

    2024年02月02日
    浏览(47)
  • SpringBoot+Vue整合WebSocket实现实时通讯

            在开发过程中,我们经常遇到需要对前台的列表数据,实现实时展示最新的几条数据,或者是调度的任务进度条实现实时的刷新......,而对于这种需求,无状态的http协议显然无法满足我们的需求,于是websocket协议应运而生。websocket协议本质上是一个基于tcp的协议

    2024年02月13日
    浏览(36)
  • SpringBoot整合Netty+Websocket实现消息推送

           Netty是一个高性能、异步事件驱动的网络应用框架,用于快速开发可维护的高性能协议服务器和客户端。以下是Netty的主要优势: 高性能 :Netty基于NIO(非阻塞IO)模型,采用事件驱动的设计,具有高性能的特点。它通过零拷贝技术、内存池化技术等手段,进一步提高

    2024年01月20日
    浏览(36)
  • (一)SpringBoot 整合WebSocket 前端 uniapp 访问

    第一次使用WebSocket,所以最需要一个及其简单的例子,跑通之后,增加自己对该技术的理解。(技术基础介绍就免掉了,后面再补)  案例逻辑:目前只有一个用户,而且是一个用户给服务器发送数据,服务给该用户返回数据 此处的逻辑一共三步 第一步,添加依赖项 第二步

    2024年02月10日
    浏览(36)
  • SpringBoot+Vue 整合websocket实现简单聊天窗口

    1 输入临时名字充当账号使用 2 进入聊天窗口 3 发送消息 (复制一个页面,输入其他名字,方便展示效果) 4 其他窗口效果 pom依赖 WebSocketConfig.java WebSocketServer.java MessageVo.java App.vue

    2024年02月09日
    浏览(38)
  • Springboot整合WebSocket实现主动向前端推送消息

            在上篇文章tcp编程中,我们实现了C++客户端与java服务器之间的通信,客户端发送了一个消息给服务器,今天我们要实现基于WebSocket实现服务器主动向前端推送消息,并且以服务器接收到C++客户端的消息主动向前端推送消息的触发条件。 WebSocket 的诞生背景       

    2024年03月16日
    浏览(35)
  • Springboot 整合 WebSocket ,使用STOMP协议 ,前后端整合实战 (一)(1)

    server: port: 9908 3.WebSocketConfig.java import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker; import org.springframework.web.socket.config.annotation.StompEndpointRegistry; import org.springfra

    2024年04月25日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包