因为最近有后端实时推送数据的需求,所以想到了websocket组件,在此写一下springboot集成使用websocket的方法,供各位童鞋参考。

注:基于test项目。

1.首先打开pom.xml引入相关依赖

<!-- webSocket -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<!-- thymeleaf模板引擎 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

2.编写websocket配置文件:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {@Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {//注册STOMP协议的节点(endpoint),并映射指定的url
        //注册一个STOMP的endpoint,并指定使用SockJS协议
        // 允许使用socketJs方式访问,访问点为webSocketServer,允许跨域
        // 在网页上我们就可以通过这个链接来和服务器的WebSocket连接
        registry.addEndpoint("/endpointTest").setAllowedOrigins("*").withSockJS();

    }@Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {//配置消息代理(Message Broker)
        //广播式应配置一个/topic消息代理
        //queue 点对点
        registry.enableSimpleBroker("/queue","/topic");

    }
}

3.webmvc配置

/**
 * @author xiaofeng
 * @version V1.0
 * @title: WebMvcConfig.java
 * @package: com.yingda.xsignal.test
 * @description: 配置viewController, 为页面提供路径映射
 * @date 2018/3/30 0030 下午 7:05
 */
@Controller
public class WebMvcConfig extends WebMvcConfigurerAdapter {/**
     * 配置viewController,提供映射路径
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/webSocket").setViewName("/webSocket");
    }
}

4.websocket控制器

/**
 * @author xiaofeng
 * @version V1.0
 * @title: WebSocketController.java
 * @package: com.yingda.xsignal.test
 * @description: webSocket控制器
 * @date 2018/3/30 0030 下午 7:04
 */
@RestController
@EnableScheduling
public class WebSocketController {private Logger logger = LoggerFactory.getLogger(getClass());

    /**
     * 当浏览器向服务端发送请求时,通过@MessageMapping映射/sendTest这个地址,类似于@ResponseMapping
     * 当服务器有消息时,会对订阅了@SendTo中的路径的浏览器发送消息
     *
     * @param message
     * @return
     */
    @MessageMapping("/sendTest")@SendTo("/topic/responseTest")public String say(String message) {try {//睡眠1秒
            Thread.sleep(1000);
        } catch (InterruptedException e) {e.printStackTrace();
        }return message;
    }

    @SubscribeMapping("/topic/responseTest")public String sub() {logger.info("X用户订阅了");
        return "thanks for your subscribe!";
    }@Autowired
    WebSocketTemplate webSocketTemplate;

    /**
     * 模拟服务端推送数据(注:必须在同一个服务内,否则无法进行订阅推送)
     */
    @Scheduled(fixedRate = 2000)public void task() {webSocketTemplate.sendMessage("服务器端推送~" + UUID.randomUUID());
    }}

WebSocketTemplate:

/**
 * @author xiaofeng
 * @version V1.0
 * @title: WebSocketTemplate.java
 * @package: com.yingda.xsignal.test.websocket.send
 * @description: webSocket发送模板
 * @date 2018/3/30 0030 下午 3:57
 */
@Component
public class WebSocketTemplate {private SimpMessagingTemplate messagingTemplate;

    @Autowired
    public WebSocketTemplate(SimpMessagingTemplate messagingTemplate) {this.messagingTemplate = messagingTemplate;
    }/**
     * 向订阅了 /topic/responseTest 客户端websocket实例发送数据
     *
     * @param message
     */
    public void sendMessage(String message) {AricMessage aricMessage = new AricMessage();
        aricMessage.setName(message);
        messagingTemplate.convertAndSend("/topic/responseTest", aricMessage);
    }
}

5.在resources -> templates中创建html文件

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8" />
    <title>SpringBoot 服务端推送消息</title>
    <script src="http://cdn.bootcss.com/sockjs-client/1.1.1/sockjs.min.js"></script>
    <script src="http://cdn.bootcss.com/stomp.js/2.3.3/stomp.js"></script>
    <script src="http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js"></script>
</head>
<body>
<div>
    <div>
        <button id="connect" οnclick="connect();">connect</button>
        <button id="disconnect" disabled="disabled" οnclick="disconnect();">disconnect</button>
    </div>
    <div id="conversationDiv">
        <div id="response"></div>
    </div>
</div>
</body>
<script type="text/javascript">
    var stompClient = null;

    function setConnected(connected){document.getElementById('connect').disabled = connected;
        document.getElementById('disconnect').disabled = !connected;
        document.getElementById('conversationDiv').style.visibility = connected ? 'visible' : 'hidden';
        $("#response").html();
    }function connect(){var socket = new SockJS('/endpointTest'); //连接SockJS的endpoint名称为"endpointTest"
        stompClient = Stomp.over(socket);//使用STMOP子协议的WebSocket客户端
        stompClient.connect({},function(frame){//连接WebSocket服务端
            setConnected(true);
            console.log('Connected:' + frame);
            //通过stompClient.subscribe订阅/topic/responseTest 目标(destination)发送的消息,这个是在控制器的@SentTo中定义的
            stompClient.subscribe('/topic/responseTest',function(response){showResponse(JSON.parse(response.body).name);
            });
        });
    }function disconnect(){if(stompClient != null) {stompClient.disconnect();
        }setConnected(false);
        console.log("Disconnected");
    }function showResponse(message){var response = $("#response");
        response.html(message);
    }
</script>
</html>

启动服务,测试,点击connect,发现每隔几秒随机字符串都会发生变化,说明后台服务一直在向前端推送数据

ok,至此我们的springboot集成websocket并向前端推送数据成功,congratulation!

springboot 之 webscoket 服务端推送相关推荐

  1. springboot 实现服务端推送消息

    文章目录 前言 一.关于SSE 1. 概念介绍 2. 特点分析 3. 应用场景 二.SpringBoot实现 三.前端vue调用 四.一些问题 前言 服务端推送消息我们采用SSE方式进行推送. 一.关 ...

  2. springboot实现SSE服务端主动向客户端推送数据,java服务端向客户端推送数据,kotlin模拟客户端向服务端推送数据

    SSE服务端推送 服务器向浏览器推送信息,除了 WebSocket,还有一种方法:Server-Sent Events(以下简称 SSE).本文介绍它的用法. 在很多业务场景中,会涉及到服务端向客户端 ...

  3. Java 服务端推送消息有那么难吗?

    点击蓝色"程序猿DD"关注我 回复"资源"获取独家整理的学习资料! 转自公众号:码农小胖哥 今天项目经理交给我一个开发任务.如果有人在前台下了订单就给后台仓库管 ...

  4. PHP服务端推送技术Long Polling

    perfgeeks linux . bash . php . python . c PHP服务端推送技术Long Polling Long Polling与Polling概述 服务端推送技术应用越来越 ...

  5. JAVA实现QQ:实现文字聊天、QQ用户登录、拉取在线用户列表、无异常退出、私聊、发文件、下载文件、离线留言、服务端推送新闻等功能(后端无界面,Utilty源码在后面、)

    这个仿QQ项目是参考韩顺平老师的多线程课程做的,因为个人觉得非常有意义特别是让我对多线程通信又了一个新的理解因此我准备写一篇总结(如果觉得视频太长可以参考下): 具体视频地址:大家给韩老师一键三连[韩 ...

  6. nett服务器接收消息的方法,C#(一沙框架) .net core3.1 SignalR 服务端推送消息至客户端的实现方法,用弹窗插件进行显示,非常美观实用...

    C#(一沙框架) .net core3.1 SignalR 服务端推送消息至客户端的实现方法,用弹窗插件进行显示,非常美观实用 运行效果: 1.安装Microsoft.AspNetCore.Signa ...

  7. 关注微信公众号并接收服务端推送通知

    这是一篇写在公司内网confluence上的文章,今天打开博客发现好久没有更新了,偷个懒直接来个搬运. 1.应用场景 终端用户关注客户微信公众号后,在公众号上可以接收到服务端发来的关联设备的报警信息 ...

  8. 物联网设备数据流转之数据如何实时推送至前端:WebSocket服务端推送

    背景 还记得,我们在物联网设备数据流转之实时数据从哪里来.如何转发:Node.js, MQTT, EMQX的WebHook这篇文章中,当 EMQX 的 WebHook 收到来自设备的消息时,我们当时只 ...

  9. html5 sse java_html5----sse实现服务端推送数据给前端

    案例基于thinkPHP框架: 服务端方法:public function ssefun() { ob_implicit_flush(); header('Content-Type: text/eve ...

最新文章

  1. 使用WinHttp接口实现HTTP协议Get、Post和文件上传功能
  2. 朱翊:从鼎级云珍冰箱看卡萨帝的百年品牌逻辑
  3. Linux下编译Boost
  4. 的union_C语言“隐秘的角落”——union没那么简单
  5. Navicat15安装笔记
  6. 不重叠的线段(51Nod-1133)
  7. 拥有中国最深基坑的超高层建筑完成地下连续墙施工
  8. Redis RDB和AOF总结
  9. wincc版本升级_【西门子】WinCC V7.4 SP1:常规信息和安装 (较新).pdf
  10. S32K NVIC配置(以外部中断为例)
  11. centos误删除后文件恢复
  12. FPGA LVDS液晶屏
  13. zotero导出所有的bib文件
  14. 角色设计竟然有这些小技巧
  15. java实现找一条转乘次数最少的公交线路?,基于最优换乘次数的城市公交查询算法...
  16. 基于Android和Java的校园外卖系统设计与实现
  17. 不重视需求过程的项目队伍将自食其果
  18. 机器学习预测股票收益(一)之随机森林模型
  19. HTMLbutton 标签和input type=button的区别
  20. windows系统键盘无法使用快捷键

热门文章

  1. delimited mysql_在MySQL中存儲逗號分隔的數據
  2. 电脑显示没有被指定在上运行_游戏编年史:这也许是世界上第一款可运行的电脑游戏...
  3. oracle mysql 创建表,Oracle 创建表用户、空间
  4. 关于虚拟机vmware三种网络模式
  5. UVA12412 A Typical Homework (a.k.a Shi Xiong Bang Bang Mang)
  6. Jquery加载默认值
  7. 由归并算法引申出来的其他问题
  8. LoadRunner变量到参数的互换
  9. java遍历所有目录和文件
  10. 深度学习 CNN CUDA 版本2