springboot+websocket示例
1、新建maven工程
工程结构如下:
完整的pom.xml如下:
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.websocket.demo</groupId>
- <artifactId>websocket-demo</artifactId>
- <version>1.0-SNAPSHOT</version>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>1.4.1.RELEASE</version>
- </parent>
- <dependencies>
- <!-- thymeleaf 模板的配置 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <!-- spring websocket的配置 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-websocket</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-devtools</artifactId>
- <scope>runtime</scope>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-autoconfigure</artifactId>
- <version>1.4.5.RELEASE</version>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
2、application.properties 的配置如下
- #thymeleaf start
- #spring.thymeleaf.mode=HTML5
- spring.thymeleaf.encoding=UTF-8
- spring.thymeleaf.content-type=text/html
- #开发时关闭缓存,不然没法看到实时页面
- spring.thymeleaf.cache=false
- spring.thymeleaf.prefix=classpath:/templates/
- #thymeleaf end
- server.port=8082
3、启动类
- package com.websocket;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- /**
- * @author Administrator
- * @date 2018/08/18
- */
- @SpringBootApplication
- public class Application {
- public static void main(String[] args) throws Exception {
- SpringApplication.run(Application.class, args);
- }
- }
4、WebsocketConfig 类进行了websocket的配置
- package com.websocket.config;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.messaging.simp.config.MessageBrokerRegistry;
- import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
- import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
- import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
- /**
- * @author hzb
- * @date 2018/09/30
- */
- @Configuration
- @EnableWebSocketMessageBroker
- public class WebsocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
- @Override
- public void configureMessageBroker(MessageBrokerRegistry config) {
- //启用/userTest,/topicTest,两个消息前缀
- config.enableSimpleBroker("/userTest","/topicTest");
- //如果不设置下面这一句,用convertAndSendToUser来发送消息,前端订阅只能用/user开头。
- config.setUserDestinationPrefix("/userTest");
- //客户端(html等)向服务端发送消息的前缀
- config.setApplicationDestinationPrefixes("/app");
- }
- @Override
- public void registerStompEndpoints(StompEndpointRegistry stompEndpointRegistry) {
- //客户端和服务端进行连接的endpoint
- stompEndpointRegistry.addEndpoint("/websocket-endpoint").setAllowedOrigins("*").withSockJS();
- }
- }
5、消息管理实现类
- package com.websocket.controller;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.messaging.handler.annotation.MessageMapping;
- import org.springframework.messaging.handler.annotation.SendTo;
- import org.springframework.messaging.simp.SimpMessagingTemplate;
- import org.springframework.scheduling.annotation.EnableScheduling;
- import org.springframework.scheduling.annotation.Scheduled;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.GetMapping;
- import java.text.DateFormat;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- /**
- * @author hzb
- * @date 2018/09/30
- */
- @Controller
- @EnableScheduling
- public class WebsocketMsgController {
- @Autowired
- private SimpMessagingTemplate messagingTemplate;
- @GetMapping("/")
- public String index() {
- return "index";
- }
- /**
- * index.html将message发送给后端,后端再将消息重组后发送到/topicTest/web-to-server-to-web
- * @param message
- * @return
- * @throws Exception
- */
- @MessageMapping("/send")
- @SendTo("/topicTest/web-to-server-to-web")
- public String send(String message) throws Exception {
- DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- return "服务器将原消息返回: "+df.format(new Date())+" :" + message;
- }
- /**
- * 最基本的服务器端主动推送消息给前端
- * @return
- * @throws Exception
- */
- @Scheduled(fixedRate = 1000)
- public String serverTime() throws Exception {
- // 发现消息
- DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- messagingTemplate.convertAndSend("/topicTest/servertime", df.format(new Date()));
- return "servertime";
- }
- /**
- * 以下面这种方式发送消息,前端订阅消息的方式为: stompClient.subscribe('/userTest/hzb/info'
- * @return
- * @throws Exception
- */
- @Scheduled(fixedRate = 1000)
- public String serverTimeToUser() throws Exception {
- // 发现消息
- DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
- //这里虽然没有指定发送前缀为/userTest,但是在WebsocketConfig.java中设置了config.setUserDestinationPrefix("/userTest"),
- //否则默认为/user
- messagingTemplate.convertAndSendToUser("hzb","/info", df.format(new Date()));
- return "serverTimeToUser";
- }
- }
前端代码:index.html
- <!DOCTYPE html>
- <html>
- <head>
- <title>玩转spring boot——websocket</title>
- <script src="//cdn.bootcss.com/angular.js/1.5.6/angular.min.js"></script>
- <script src="https://cdn.bootcss.com/sockjs-client/1.1.4/sockjs.min.js"></script>
- <script src="https://cdn.bootcss.com/stomp.js/2.3.3/stomp.min.js"></script>
- <script type="text/javascript">
- var stompClient = null;
- var app = angular.module('app', []);
- app.controller('MainController', function($rootScope, $scope, $http) {
- $scope.data = {
- connected : false,
- sendMessage : '',
- receivMessages : []
- };
- //连接
- $scope.connect = function() {
- var socket = new SockJS('/websocket-endpoint');
- stompClient = Stomp.over(socket);
- stompClient.connect({}, function(frame) {
- // 订阅后端主动推消息到前端的topic
- stompClient.subscribe('/topicTest/servertime', function(r) {
- $scope.data.time = '当前服务器时间:' + r.body;
- $scope.data.connected = true;
- $scope.$apply();
- });
- // 阅后端主动推消息到前端的topic,只有指定的用户(hzb)收到的的消息
- stompClient.subscribe('/userTest/hzb/info', function(r) {
- $scope.data.hzbtime = '当前服务器时间:' + r.body;
- $scope.data.connected = true;
- $scope.$apply();
- });
- // 订阅前端发到后台,后台又将消息返回前台的topic
- stompClient.subscribe('/topicTest/web-to-server-to-web', function(msg) {
- $scope.data.receivMessages.push(msg.body);
- $scope.data.connected = true;
- $scope.$apply();
- });
- $scope.data.connected = true;
- $scope.$apply();
- });
- };
- $scope.disconnect = function() {
- if (stompClient != null) {
- stompClient.disconnect();
- }
- $scope.data.connected = false;
- }
- $scope.send = function() {
- stompClient.send("/app/send", {}, JSON.stringify({
- 'message' : $scope.data.sendMessage
- }));
- }
- });
- </script>
- </head>
- <body ng-app="app" ng-controller="MainController">
- <h2>websocket示例</h2>
- <label>WebSocket连接状态:</label>
- <button type="button" ng-disabled="data.connected" ng-click="connect()">连接</button>
- <button type="button" ng-click="disconnect()" ng-disabled="!data.connected">断开</button>
- <br/>
- <br/>
- <div ng-show="data.connected">
- <h4>以下是websocket的服务端主动推送消息到页面的例子</h4>
- <label>{{data.time}}</label> <br/> <br/>
- </div>
- <div ng-show="data.connected">
- <h4>以下是websocket的服务端主动推送消息到页面的例子,只有hzb这个用户收到</h4>
- <label>{{data.hzbtime}}</label> <br/> <br/>
- </div>
- <div ng-show="data.connected">
- <h4>以下是websocket的客户端发消息到服务端,服务端再将该消息返回到客户端(页面)的例子</h4>
- <input type="text" ng-model="data.sendMessage" placeholder="请输入内容..." />
- <button ng-click="send()" type="button">发送</button>
- <br/>
- <table>
- <thead>
- <tr>
- <th>消息内容:</th>
- </tr>
- </thead>
- <tbody>
- <tr ng-repeat="messageContent in data.receivMessages">
- <td>{{messageContent}}</td>
- </tr>
- </tbody>
- </table>
- </div>
- </body>
- </html>
运行效果
没有点“连接”之前
点了“连接”之后
输入内容:点击发送
springboot+websocket示例的更多相关文章
- SpringBoot + WebSocket 开发笔记
1. 服务端的实现,我尝试了两种方式: 第一种是用“@ServerEndPoint”注解来实现,实现简单: 第二种稍显麻烦,但是可以添加拦截器在WebSocket连接建立和断开前进行一些额外操作. 不 ...
- Springboot+Websocket+JWT实现的即时通讯模块
场景 目前做了一个接口:邀请用户成为某课程的管理员,于是我感觉有能在用户被邀请之后能有个立马通知他本人的机(类似微博.朋友圈被点赞后就有立马能收到通知一样),于是就闲来没事搞了一套. 涉及技术栈 ...
- 转:php使用websocket示例详解
原文来自于:http://www.jb51.net/article/48019.htm 这篇文章主要介绍了php使用websocket示例,需要的朋友可以参考下 下面我画了一个图演示 client ...
- WebSocket 示例
websocket应运而生 在WebSocket规范提出之前,开发人员若要实现带有即时通信.实时数据.订阅推送等功能的应用实时性较强的功能,经常会使用的解决方法是 Comet. Comet是一种服务器 ...
- SpringBoot+WebSocket
SpringBoot+WebSocket 只需三个步骤 导入依赖 <dependency> <groupId>org.springframework.boot</grou ...
- springboot+websocket+sockjs进行消息推送【基于STOMP协议】
springboot+websocket+sockjs进行消息推送[基于STOMP协议] WebSocket是在HTML5基础上单个TCP连接上进行全双工通讯的协议,只要浏览器和服务器进行一次握手,就 ...
- dubbo+zookeeper+springboot简单示例
目录 dubbo+zookeeper+springboot简单示例 zookeeper安装使用 api子模块 生产者producer 消费者consumer @(目录) dubbo+zookeeper ...
- SpringBoot WebSocket STOMP 广播配置
目录 1. 前言 2. STOMP协议 3. SpringBoot WebSocket集成 3.1 导入websocket包 3.2 配置WebSocket 3.3 对外暴露接口 4. 前端对接测试 ...
- Java Springboot webSocket简单实现,调接口推送消息到客户端socket
Java Springboot webSocket简单实现,调接口推送消息到客户端socket 后台一般作为webSocket服务器,前台作为client.真实场景可能是后台程序在运行时(满足一定条件 ...
随机推荐
- 844. Backspace String Compare判断删除后的结果是否相等
[抄题]: Given two strings S and T, return if they are equal when both are typed into empty text editor ...
- 实现Hibernate框架的CRUD
1.创建Web项目HS_test如图所示: 2.创建数据库DBHSTest,在数据库中创建表Teacher,并插入数据 3.在Myeclipse中调出DB Brower视图 右键->New: 连 ...
- 纯css实现div中未知尺寸图片的垂直居中
1.淘宝的方法 在曾经的"淘宝UED招聘"中有这样一道题目: “使用纯CSS实现未知尺寸的图片(但高宽都小于200px)在200px的正方形容器中水平和垂直居中.” 当然出题并不是 ...
- BTC和BCH 区别和联系?
在比特币刚刚出现的时期,中本聪对区块的大小限制在1M.这种限制既保障性能较弱的个人电脑能够参与其中,同时也起到了防止攻击者让比特币网络超载的风险发生,毕竟那时系统还很脆弱.在1M的限制下,10分钟一个 ...
- Class 'com.mchange.v2.c3p0.ComboPooledDataSource' not found [config set
解决方法: 修改maven <dependency> <groupId>c3p0</groupId> <artifactId>c3p0</arti ...
- Linux netstat
一.简介 二.语法 三.实例 1)查看TCP连接数 netstat -n | awk '/^tcp/ {++S[$NF]} END {for (a in S) print a, S[a]}'
- Ubuntu 软件包管理工具 dpkg, APT 的一些命令(转载)
转载地址: http://www.dreamxu.com/ubuntu-package-dpkg-and-apt-commands/ dpkg dpkg 是由 Debian 开发的包管理系统,是一个比 ...
- RDMA的原理、传输与Verbs
RDMA的原理.传输与Verbs RDMA最早专属于infiniband架构.在网络融合的大趋势下出现的RoCE,使高速.超低延时.极低cpu使用率的RDMA得以部署在目前使用最广泛的以太网上. ...
- javascript 高级程序设计 二
这里我们直接进入主题: 在JS刚刚开始的时候,必须面临一个问题,那就是如何使的JS的加载和执行不会影响web核心语言HTML的展示效果,和HTML和谐共存. 在这个背景下<script>标 ...
- 调试程序时如何用syslog来打印信息
转自:https://www.cnblogs.com/vigarbuaa/archive/2013/02/05/2892544.html Linux下C语言编程的-把程序输出信息加到系统日志里去关键词 ...