广告
返回顶部
首页 > 资讯 > 精选 >springboot集成websocket
  • 169
分享到

springboot集成websocket

springbootwebsocketjava支付宝小程序 2023-08-16 17:08:26 169人浏览 薄情痞子
摘要

SpringBoot集成websocket 1. 前言 ​ 这里我们使用springboot搭建一个轻量级的WEBSocket服务,同时提供4个入参。使用websocket服务可以轻松和微信小程序、支付宝小程序、网页就行双向通讯,非常实用方

SpringBoot集成websocket

1. 前言

​ 这里我们使用springboot搭建一个轻量级的WEBSocket服务,同时提供4个入参。使用websocket服务可以轻松和微信小程序、支付宝小程序、网页就行双向通讯,非常实用方便。

  1. wss地址
    这里是我们自己搭建的中转服务websocket地址。

    wss://xxxx.cn/netgate/auth/pid/sn/openid
  2. 参数说明

    参数名称参数说明
    auth自定义标识符,用于鉴权处理
    pid设备产品ID【设备二维码中包含此信息】
    sn设备序列号【设备二维码中包含此信息】
    openid用户自己的id。可以使用个人平台的用户唯一id。相同ID会挤掉前一个用户的ws连接

2. 引入依赖

      org.springframework.boot     spring-boot-starter-websocket 

3. 配置文件

​ 新增WebSocketConfig.java的配置文件。用来初始化websocket

@Configuration@EnableWebSocketpublic class WebSocketConfig implements WebSocketConfigurer{    @Override    public void reGISterWebSocketHandlers(WebSocketHandlerRegistry registry) {       registry.addHandler(webSocketHandler(),"/netgate/{auth}/{pid}/{sn}/{openid}")                          //注册Handler           .addInterceptors(new WebSocketHandshakeInterceptor())           //注册Interceptor           .setAllowedOrigins("*");     //注册Interceptor//     //2.注册Sockjs,提供SockJS支持(主要是兼容ie8)//     String sockjs_url = "/sockjs/socketServer.do";                          //设置sockjs的地址//     registry.addHandler(netgateHandler, sockjs_url)                         //注册Handler//         .addInterceptors(new WebSocketHandshakeInterceptor())               //注册Interceptor//         .withSockJS();                          //支持sockjs协议    }    @Bean    public ServletServerContainerFactoryBean createWebSocketContainer() {        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();        container.setMaxTextMessageBufferSize(2*1024*1024);//8192*1024 1024*1024*1024        container.setMaxBinaryMessageBufferSize(2*1024*1024);        container.setAsyncSendTimeout(55000l);        container.setMaxSessionIdleTimeout(55000l);//心跳        return container;    }    @Bean    public TextWebSocketHandler webSocketHandler() {        return new NetgateHandler();    }}

4. Websocket握手过滤器

​ 过滤器的作用主要是用来做连接接入的鉴权,和参数解析。

​ 新增WebSocketHandshakeInterceptor.java文件

public class WebSocketHandshakeInterceptor implements HandshakeInterceptor {    private final static Logger LOGGER = LoggerFactory.getLogger(WebSocketHandshakeInterceptor.class);     public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Map attributes) throws Exception {        if (request instanceof ServletServerHttpRequest) {        String path = request.getURI().getPath();        if(requestIsValid(path)){        String[] params = getParams(path);        attributes.put("WEBSOCKET_AUTH", params[0]);        attributes.put("WEBSOCKET_PID", params[1]);        attributes.put("WEBSOCKET_SN", params[2]);        attributes.put("WEBSOCKET_OPENID", params[3]);        attributes.put("WEBSOCKET_FIRSTONE","yes");        }        }        System.out.println("================Before Handshake================");        return true;    }     public void afterHandshake(ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse, WebSocketHandler webSocketHandler, Exception e) {    System.out.println("================After Handshake================");    if(e!=null) e.printStackTrace();    System.out.println("================After Handshake================");    }        private boolean requestIsValid(String url){        //在这里可以写上具体的鉴权逻辑    boolean isvalid = false;    if(StringUtils.isNotEmpty(url)    && url.startsWith("/netgate/")    && url.split("/").length==6){    isvalid = true;    }    return isvalid;    }        private String[] getParams(String url){    url = url.replace("/netgate/","");    return url.split("/");    }    }

5. Websocket处理器

​ 在这里可以做消息的接收和发送。

​ 这里MQttGateway是springboot整合MQtT客户端的服务类。具体可以参考下一篇的springboot集成mqtt

​ 新建NetgateHandler.java文件

@Componentpublic class NetgateHandler extends TextWebSocketHandler {@Autowiredprivate MqttGateway mqttGateway;        private static ConcurrentHashMap> netgates = new ConcurrentHashMap>();            @Override    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {    if(!session.isOpen()) {System.out.println("连接已关闭,不再处理该连接的消息!");return;}    String mes = ObjectUtils.toString(message.getPayload(),"");    String pid = session.getAttributes().get("WEBSOCKET_PID").toString();    String sn = session.getAttributes().get("WEBSOCKET_SN").toString();if(message==null || "".equals(mes)){System.out.println(getSysDate()+"============接收到空消息,不予处理。");}else if(mes.length()==1){//心跳消息过滤掉return;}else {//转发成mqtt消息String topic = "pay/"+pid+"/server/"+sn;System.out.println(topic);System.out.println(getSysDate()+"============消息处理完成:"+mes);mqttGateway.sendToMqtt(topic,mes);}    }          @Override    public void afterConnectionEstablished(WebSocketSession session) throws Exception {    System.out.println(getSysDate()+"============正在初始化连接:"+session.getId());        try {            //初始化连接,把session存储起来this.initUsers(session);} catch (Exception e) {System.out.println(getSysDate()+"============初始化连接异常-开始:"+e.getMessage());e.printStackTrace();System.out.println(getSysDate()+"============初始化连接异常-结束:"+e.getMessage());}        System.out.println(getSysDate()+"============初始化连接完成:"+session.getId());    }         @Override    public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {    System.out.println(getSysDate()+"============正在关闭连接:"+session.getId()+",isOpen:"+session.isOpen()+";code:"+status.getCode());    try {    System.out.println("断开连接状态值"+status.getCode());this.removeSession(session);} catch (Exception e) {System.out.println(getSysDate()+"============关闭连接异常-开始:"+e.getMessage());e.printStackTrace();System.out.println(getSysDate()+"============关闭连接异常-结束:"+e.getMessage());}    System.out.println(getSysDate()+"============正在关闭完成:"+session.getId()+",isOpen:"+session.isOpen()+";code:"+status.getCode());    }         @Override    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception {    System.out.println(getSysDate()+"============发生传输错误:"+session.getId()+";session.isOpen():"+session.isOpen()+";exception:"+exception.getMessage());    exception.printStackTrace();    if (session.isOpen()) {        //try { session.close(); } catch (Exception e) {e.printStackTrace();}        }else {        try {    this.removeSession(session);    } catch (Exception e) {    System.out.println(getSysDate()+"============传输错误处理异常-开始:"+e.getMessage());    e.printStackTrace();    System.out.println(getSysDate()+"============传输错误处理异常-结束:"+e.getMessage());    }        }    System.out.println(getSysDate()+"============错误处理结束:"+session.getId()+";session.isOpen():"+session.isOpen()+";exception:"+exception.getMessage());    }public synchronized void sendMsgToNetgateSn(String sn, String msg)  {if(netgates.size()>0 && netgates.containsKey(sn) && !netgates.get(sn).isEmpty()){//获取EID对应的后台管理连接 多个for (WebSocketSession ws: netgates.get(sn).values()){System.out.println("对网关指令开始发送啦:sn="+sn+"消息内容"+msg);try {ws.sendMessage(new TextMessage(msg));} catch (IOException e) {System.out.println(getSysDate()+"发生了异常:"+e.getMessage());e.printStackTrace();continue;}}}}    //连接接入的处理方法private synchronized void initUsers(WebSocketSession session){String pid = (String) session.getAttributes().get("WEBSOCKET_PID");String sn = (String) session.getAttributes().get("WEBSOCKET_SN");String openid = (String) session.getAttributes().get("WEBSOCKET_OPENID");if(StringUtils.isNotEmpty(pid) && StringUtils.isNotEmpty(sn) && StringUtils.isNotEmpty(openid)){ConcurrentHashMap netgate = netgates.get(sn);if(netgate == null){netgate = new ConcurrentHashMap();}WebSocketSession session_exist = netgate.get(sn);if(session_exist!=null) {System.out.println("检测到相同SN重复连接,SN:"+sn+",连接ID:"+session_exist.getId()+",准备清理失效的连接。。。");try {session_exist.close();} catch (IOException e) {e.printStackTrace();}}netgate.putIfAbsent(openid, session);netgates.put(sn,netgate);}}    //连接被关闭时处理集合private synchronized void removeSession(WebSocketSession session){String sn = (String) session.getAttributes().get("WEBSOCKET_SN");String openid = (String) session.getAttributes().get("WEBSOCKET_OPENID");if(netgates.get(sn).containsKey(openid)) {WebSocketSession exist_session = netgates.get(sn).get(openid);//确保是同一个session 不是同一个session则不应该进行下一步的处理if(exist_session.getId()!=null && exist_session.getId().equals(session.getId())) {netgates.get(sn).remove(openid);System.out.println("有一网关连接关闭!SN:"+sn+",当前在线数量为"+netgates.get(sn).keySet().size());}else {System.out.println("检测到关闭session异常,程序中断处理,关闭sessionId:"+session.getId()+",当前实际sessionId:"+exist_session.getId());}}else {System.out.println("检测到关闭session异常,程序中断处理,系统中未找到对应的session,Sn="+sn+"openid="+openid);}}private String getSysDate() { SimpleDateFORMat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式        return df.format(new Date());}}

6. 下一篇

springboot集成mqtt

来源地址:https://blog.csdn.net/qq_35921773/article/details/127451903

--结束END--

本文标题: springboot集成websocket

本文链接: https://www.lsjlt.com/news/371732.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • springboot集成websocket
    springboot集成websocket 1. 前言 ​ 这里我们使用springboot搭建一个轻量级的websocket服务,同时提供4个入参。使用websocket服务可以轻松和微信小程序、支付宝小程序、网页就行双向通讯,非常实用方...
    99+
    2023-08-16
    spring boot websocket java 支付宝小程序
  • springboot如何集成websocket
    这篇文章主要介绍了springboot如何集成websocket,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1. 原生注解pom.xml<dependency>...
    99+
    2023-06-22
  • springboot集成websocket的四种方式小结
    目录1. 原生注解 2. Spring封装 3. TIO STOMP Session 共享的问题 如何选择 其它 参考链接 1. 原生注解 pom.xml <depen...
    99+
    2022-11-12
  • springboot怎么集成websocket实现消息推送
    要在Spring Boot中集成WebSocket实现消息推送,可以按照以下步骤进行操作: 添加依赖:在`pom.xml`文件中添...
    99+
    2023-10-26
    springboot websocket
  • SpringBoot集成webservice
    前言 之前在工作中,有时候需要去对接第三方的医院,而很多医院的his系统用的都是老技术(WebService)。一直在对接webservice接口,却不知道webservice接口是怎么实现的,这一次...
    99+
    2023-09-23
    spring boot java spring
  • springboot集成Ldap
    一、什么是Ldap 轻型目录访问协议(英文:Lightweight Directory Access Protocol,缩写:LDAP,/ˈɛldæp/)是一个开放的,中立的,工业标准的应用协议,通过...
    99+
    2023-09-13
    spring boot 服务器 后端
  • Springboot集成GraphicsMagick
    目录以什么方式集成?项目集成1、将gm命令行工具引入到项目中2、在项目启动的时候自动初始化环境3、gm进程池化性能初测写在最后以什么方式集成? JNI / 命令行(im4java)...
    99+
    2022-11-12
  • Springboot集成Neo4j
    一、概述  1.为什么图形数据库?         生活在一个互联的世界中,大多数领域需要处理丰富的连接集以了解真正发生的事情。通常,我们发现项目之间的联系与项目本身一样重要。         虽然现有的关系数据库可以存储这些关...
    99+
    2023-09-05
    spring boot java spring
  • SpringBoot集成 ElasticSearch
    Spring Boot 集成 ElasticSearch 对于ElasticSearch比较陌生的小伙伴可以先看看ElasticSearch的概述ElasticSearch安装、启动、操作及概念简介 好的开始啦~ 1、基础操作 1.1、导入...
    99+
    2023-08-18
    elasticsearch spring boot java maven intellij-idea
  • SpringBoot随笔-SpringBoot集成Druid
    1.Druid是什么     Druid是Java语言中最好的数据库连接池之一,Druid能够提供强大的监控和扩展功能。 2.Druid连接池的优点: 强大的监控特性,通过Druid提供的监控功能,可以清楚知道连接池和SQ...
    99+
    2014-09-25
    SpringBoot随笔-SpringBoot集成Druid
  • springBoot(11):集成Mybatis
    一、添加依赖<!--mybatis--> <dependency>    <groupId>org.mybatis.spring.boot&...
    99+
    2022-10-18
  • springBoot(12):集成Druid
    一、添加依赖<!--mybatis-开始--> <dependency>    <groupId>org.mybatis.spring.bo...
    99+
    2022-10-18
  • springBoot(22):集成mongodb
    一、添加依赖<!-- mongodb --> <dependency>    <groupId>org.springfr...
    99+
    2022-10-18
  • springboot集成redis lettuce
    目前java操作redis的客户端有jedis跟Lettuce。在springboot1.x系列中,其中使用的是jedis,但是到了springboot2.x其中使用的是Lettuc...
    99+
    2022-11-12
  • springboot业务功能实战之告别轮询websocket的集成使用
    目录后端代码前段代码总结后端代码 首先加入pom文件 <dependency> <groupId>org.spring...
    99+
    2022-11-13
    springboot集成websocket websocket集成使用
  • springboot如何集成shiro
    这篇文章主要介绍了springboot如何集成shiro,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、项目整体介绍:项目整体的结构如下图所示,项目整体采用 springb...
    99+
    2023-06-15
  • SpringBoot如何集成RabbitMQ
    这篇文章主要介绍“SpringBoot如何集成RabbitMQ”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“SpringBoot如何集成RabbitMQ”文章能帮助大家解决问题。一、RabbitMQ...
    99+
    2023-06-30
  • SpringBoot怎样集成redis
    这篇文章给大家分享的是有关SpringBoot怎样集成redis的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。定义REmote DIctionary Server(Redis) ...
    99+
    2022-10-18
  • SpringBoot 集成Redis 过程
    Redis 介绍: Redis 服务 Redis (REmote Dictionary Server) 是一个由Salvatore Sanfilippo 完成的key-value存储...
    99+
    2022-11-12
  • SpringBoot如何集成swagger
    小编给大家分享一下SpringBoot如何集成swagger,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件。本文简单介绍了在项目中集成swagge...
    99+
    2023-05-30
    spring boot swagger
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作