之前在做站内信时,用到了 WebSocket ,整理了一些笔记分享如下。
本文基于 SpringBoot 2.1.5,本文不涉及环境搭建。

引入依赖

在 Spring 中要使用 WebSocket 功能,需要在pom中引入依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

配置类

增加一个配置类,用于定义 WebSocket 全局配置信息

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {/*** 注册stomp端点* @param registry*/@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {## 允许使用socketJs方式访问 即可通过http://IP:PORT/xboot/ws来和服务端websocket连接registry.addEndpoint("/tmax/ws").setAllowedOrigins("*").withSockJS();}/*** 配置信息代理* @param registry*/@Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) {## 订阅Broker名称 user点对点 topic广播即群发registry.enableSimpleBroker("/user","/topic");## 全局(客户端)使用的消息前缀registry.setApplicationDestinationPrefixes("/app");## 点对点使用的前缀 无需配置 默认/userregistry.setUserDestinationPrefix("/user");}
}

来看一下这两个方法:

1、registerStompEndpoints(StompEndpointRegistry registry)

注册stomp端点。起到的作用就是添加一个服务端点,来接收客户端的连接,
registry.addEndpoint("/tmax/ws") 表示添加了一个 /tmax/ws 端点,客户端可以通过这个端点来进行连接。withSockJS() 的作用是开启 SockJS 访问支持,即可通过http://IP:PORT/tmax/ws 来和服务端 websocket 连接。

2、configureMessageBroker(MessageBrokerRegistry registry)

配置信息代理。定义消息代理,设置消息连接请求的各种规范信息。
registry.enableSimpleBroker("/user","/topic") 表示客户端订阅地址的前缀信息,也就是客户端接收服务端消息的地址的前缀信息(比较绕,看完整个例子,大概就能明白了)registry.setApplicationDestinationPrefixes("/app") 指服务端接收地址的前缀,意思就是说客户端给服务端发消息的地址的前缀。
registry.setUserDestinationPrefix("/user") 指推送用户前缀。

我不不难发现,setApplicationDestinationPrefixessetUserDestinationPrefix 起到的效果敲好相反,一个定义了客户端接收的地址前缀,一个定义了客户端发送地址的前缀。

开始业务代码的编写

先了解几个知识点,下方会用到。

1、MessageMapping

接收客户端请求连接注解。Spring 对于 WebSocket 封装的特别简单,提供了一个 @MessageMapping 注解,功能类似 @RequestMapping,它是存在于Controller中的,定义一个消息的基本请求,功能也跟 @RequestMapping类似,包括支持通配符 的url定义等等。

2、SimpMessagingTemplate

SimpMessagingTemplate 是 Spring-WebSocket 内置的一个消息发送工具,可以将消息发送到指定的客户端。

3、SendTo

@SendTo 可以把消息广播到路径上去,例如下面可以把消息广播到 "/topic/greetings”,如果客户端在这个路径订阅消息,则可以接收到消息

接下来看一下后台代码实现,HelloController

/*** @author niceyoo*/
@Slf4j
@Controller
@Api(description = "hello接口")
@Transactional
public class HelloController {@Autowiredprivate SimpMessagingTemplate messagingTemplate;/*** 跳转至hello.html界面* @return*/@RequestMapping("/hello")public String hello(){return "hello";}/*** 接收然后转发至客户端消息* @param message* @return* @throws Exception*/@MessageMapping("/top")@SendTo("/topic/greetings")public String greeting(String message) throws Exception {System.out.println("receiving " + message);System.out.println("connecting successfully.");return "AAA:"+message;}/*** 推送消息* @return*/@ResponseBody@RequestMapping("/hello/addMessage")public Result<Object> addMessage(){messagingTemplate.convertAndSend("/topic/greetings", "您收到了新的系统消息");return new ResultUtil<Object>().setSuccessMsg("添加成功");}}

hello.html 代码:

<!doctype html>
<html>
<head><script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script><script src="https://cdn.bootcss.com/sockjs-client/1.3.0/sockjs.js"></script><script src="https://cdn.bootcss.com/stomp.js/2.3.3/stomp.js"></script><style>.box {width: 300px;float: left;margin: 0 20px 0 20px;}.box div, .box input {border: 1px solid;-moz-border-radius: 4px;border-radius: 4px;width: 100%;padding: 0px;margin: 5px;}.box div {border-color: grey;height: 300px;overflow: auto;}.box input {height: 30px;}h1 {margin-left: 30px;}body {background-color: #F0F0F0;font-family: "Arial";}</style>
</head>
<body lang="en">
<h1>Index</h1>
<div id="first" class="box"><div></div><input autocomplete="off" value="Type here..."></input><button onclick="connect()">登陆客户端</button><button onclick="send()">发送消息</button>
</div>
<script>var stompClient = null;var sockjs_url = '/tmax/ws';function connect() {var sockjs = new SockJS(sockjs_url);stompClient = Stomp.over(sockjs);stompClient.connect({}, function(frame) {console.log('Connected: ' + frame);stompClient.subscribe('/topic/greetings', function(greeting){console.log("返回内容:"+greeting.body);print('服务器:', greeting.body);});});}function send() {if(stompClient == null){print('系统提示:', '请先点击客户端登陆');return false;}print('客户端:', inp.val());stompClient.send("/app/top", {}, inp.val());inp.val('');}$('#first input').focus();var div  = $('#first div');var inp  = $('#first input');var print = function(m, p) {p = (p === undefined) ? '' : p;div.append($("<code>").text(m + ' ' + p));div.append($("<br>"));div.scrollTop(div.scrollTop()+10000);};</script>
</body>
</html>

操作流程:

点击“登录客户端”,输入框内输入内容,点击发送消息。

消息推送

关于消息的推送,借助 postman,调用 http://127.0.0.1:8888/hello/addMessage,实现后端推送至客户端。

额外补充,关于消息推送,往往会用到推送至指定用户,则:messagingTemplate.convertAndSendToUser(id,"/queue/subscribe", “您收到了新的消息”); ,其中id为系统用户id。

详细可搜索 SimpMessagingTemplate 的一些用法。

如果文章有错的地方欢迎指正,大家互相留言交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:niceyoo

参考地址:https://www.jianshu.com/p/60799f1356c5

WebSocket 实现前后端通信的笔记相关推荐

  1. 如何使用websocket实现前后端通信

    如何使用websocket实现前后端通信 websocket通信是很好玩的,也很有用的的通信方式,使用方式如下: 第一步由于springboot很好地集成了websocket,所以先在在pom.xml ...

  2. VUE+SpringBoot+Websocket实现前后端通信案例分享

    PS→无奈:不为模糊不清的未来担忧,只为清清楚楚的现在努力. 版权声明:本文为博主原创文章,未经博主允许不得转载. 醒来无事就把先前做过的一个websocket实现扫码登录的案例记录一下,以免以后再次 ...

  3. springboot websocket_SpringBoot 集成 WebSocket 实现前后端消息互传

    WebSocket 协议是基于 TCP 的一种新的网络协议.它实现了浏览器与服务器全双工 (full-duplex) 通信-允许服务器主动发送信息给客户端. 为什么需要WebSocket? 大家都知道 ...

  4. 05-ET框架的前后端通信1

    TIPS: 本系列贴仅用于博主学习ET框架的记录 文章目录 前言 一.ET框架的前后端如何进行通信的? 二.前后端的通信使用 1.编写protobuf消息体 2.编写C#代码 3.运行结果 总结 前言 ...

  5. 前后端分离学习笔记(5) ---[表单的增删改操作;以及为管理员上传头像]

    上一篇案例中也是查询到了表单的内容–>前后端分离学习笔记(4) -[路由嵌套, 查询表单显示] 文章目录 1.前端组件页面 添加管理员操作 修改管理员信息 删除管理员 为管理员上传头像 修改密码 ...

  6. 06-ET框架的前后端通信2

    TIPS: 本系列贴仅用于博主学习ET框架的记录 文章目录 前言 一.IMessage是什么? 二.使用步骤 1.编写proto消息体 2.编写C#代码 3.运行结果 总结 前言 这篇文章记录ET框架 ...

  7. 使用tomcat8下的websocket进行web前后端通信

    2019独角兽企业重金招聘Python工程师标准>>> 软件版本:tomcat8,tomcat8的lib下的websocket-api 学习文件:example下的websocket ...

  8. SpringBoot+Vue整合WebSocket实现前后端消息推送

    场景 WebSocket HTTP 协议是一种无状态的.无连接的.单向的应用层协议.它采用了请求/响应模型.通信请求只能由客户端发起,服务端对请求做出应答处理. 这种通信模型有一个弊端:HTTP 协议 ...

  9. python如何实现前后端交互_笔记 | 实现前后端交互的方法

    前端工程师的职责:1.UI重构 2.在正确的区域渲染出服务端的数据. 毕竟,我们要构建一个大的web应用,必然不是普普通通的静态页面构成. 下文将罗列前端工程师应该必备的同后端打交道的常用技能. 1. ...

最新文章

  1. 开启报名 | SMP-图神经网络在线研讨会2020
  2. Workaround for 1701 Cannot truncate a table referenced in a foreign key constraint using doctrine:
  3. python 框架和 spring mvc_Django和Spring MVC,该选择哪个框架进行Web开发学习?
  4. python wxpython_python GUI wxPython
  5. [css] 什么是FOUC?你是如何避免FOUC的?
  6. html字符串替换src,替换html字符串中img标签src的值.
  7. python 数组 元组 列表_python_Day_02[数组、列表、元组之篇]
  8. ISE_FIFO_IP核接口测试(一)
  9. 庖丁解牛:控件事件和数据回发概述
  10. asp.net在动态网页中的使用技巧
  11. 设置table的td宽度,不随文字变宽
  12. 采用计算机发布调度命令时 必须严格遵守,调度命令规范格式(公文命令).doc...
  13. 软件评测师——安全性基础知识
  14. 高德地图开放平台(js免费引入)
  15. 晋商到底是怎么生与死的?
  16. 申请德国农工大学计算机案例,德州农工大学本科案例
  17. 二项式系数表--杨辉三角形
  18. 基因数据处理54之bwa-mem运行paird-end(1千万条100bp的reads)
  19. C++11多线程:thread头文件
  20. 微信小游戏|开放数据域的写与读

热门文章

  1. [vue] vue的属性名称与method的方法名称一样时会发生什么问题?
  2. 前端学习(2567):指令的本质
  3. 前端学习(2275)初始化react
  4. 前端学习(1647):前端系列实战课程之选项卡实现js思路
  5. 前端学习(1438):vue三种安装方式
  6. Python time mktime()方法
  7. 移动端click延迟和tap事件
  8. vue与elementUI中给el-input绑定键盘按键--按键修饰符
  9. 2015 总结 2016 展望
  10. 计算机多媒体设计徽章,酷毙了:Hackaday将会议徽章设计成一台可编程的电脑