知识储备

  1. 什么是stomp?

    • 我们可以类比TCP与Http协议,我们知道Http协议是基于TCP协议的,Http协议解决了 web 浏览器发起请求以及 web 服务器响应请求的细节,我们在编码时候只要关注我们要发送或接受的信息就行了,不需要关注那些细节
    • 直接使用 WebSocket(SockJS) 就很类似于 使用 TCP 套接字来编写 web 应用;因为没有高层协议,因此就需要我们定义应用间所发送消息的语义,还需要确保连接的两端都能遵循这些语义;
    • 同 HTTP 在 TCP 套接字上添加 请求-响应 模型层一样,STOMP 在 WebSocket 之上提供了一个基于 帧的线路格式层,用来定义消息语义;
  2. STOMP帧格式

    • 基本格式

      1. COMMAND
      2. header1:value1
      3. header2:value2
      4. Body^@
      1. // 发送消息
      2. SEND -- 命令类型:发送
      3. destination:/queue/trade -- 头信息:标明了目的地
      4. content-type:application/json -- 头信息:标明数据交换格式
      5. content-length:44 -- 用来表示负载内容的 大小;
      6. {"action":"BUY","ticker":"MMM","shares",44}^@ -- 帧内容

项目代码

  1. 后台代码如下,主要的分析我都写在注释里了
  1. package com.study.spring.websocket.config;
  2. import org.springframework.context.annotation.Configuration;
  3. import org.springframework.messaging.converter.MessageConverter;
  4. import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver;
  5. import org.springframework.messaging.handler.invocation.HandlerMethodReturnValueHandler;
  6. import org.springframework.messaging.simp.config.ChannelRegistration;
  7. import org.springframework.messaging.simp.config.MessageBrokerRegistry;
  8. import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
  9. import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
  10. import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
  11. import org.springframework.web.socket.config.annotation.WebSocketTransportRegistration;
  12. import java.util.List;
  13. /**
  14. * @author dmz
  15. * @date Create in 12:37 2019/3/30
  16. */
  17. @Configuration
  18. /**
  19. * 通过这个注解,开启使用STOMP来传输基于message broker
  20. * 的小心,这时的控制器支持@MessageMapping,就像@RequestMapping
  21. */
  22. @EnableWebSocketMessageBroker
  23. public class Config implements WebSocketMessageBrokerConfigurer {
  24. /**
  25. * 注册STOMP端点,映射指定的url
  26. * 端点的作用——客户端在订阅或发布消息 到目的地址前,要连接该端点
  27. *
  28. * @param registry
  29. */
  30. @Override
  31. public void registerStompEndpoints(StompEndpointRegistry registry) {
  32. registry.addEndpoint("/stomp").
  33. /**
  34. * 设置允许所有域名访问
  35. */
  36. setAllowedOrigins("*").
  37. /**
  38. * 许多浏览器不支持 WebSocket 协议;
  39. * SockJS 是 WebSocket 技术的一种模拟。SockJS 会 尽可能对应 WebSocket API,
  40. * 但如果 WebSocket 技术 不可用的话,就会选择另外的 通信方式协议;
  41. */
  42. withSockJS();
  43. }
  44. /**
  45. * 配置消息代理
  46. * 如果不重载它的话,将会自动配置一个简单的内存消息代理,用它来处理以"/topic"为前缀的消息
  47. *
  48. * @param registry
  49. */
  50. @Override
  51. public void configureMessageBroker(MessageBrokerRegistry registry) {
  52. registry.enableSimpleBroker("/topic", "/queue");
  53. registry.setApplicationDestinationPrefixes("/app");
  54. //基于RabbitMQ 的STOMP消息代理
  55. // registry.enableStompBrokerRelay("/queue", "/topic")
  56. // .setRelayHost(host)
  57. // .setRelayPort(port)
  58. // .setClientLogin(userName)
  59. // .setClientPasscode(password);
  60. }
  61. @Override
  62. public void configureWebSocketTransport(WebSocketTransportRegistration registry) {
  63. }
  64. @Override
  65. public void configureClientInboundChannel(ChannelRegistration registration) {
  66. }
  67. @Override
  68. public void configureClientOutboundChannel(ChannelRegistration registration) {
  69. }
  70. @Override
  71. public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
  72. }
  73. @Override
  74. public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
  75. }
  76. @Override
  77. public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
  78. return false;
  79. }
  80. }
  1. package com.study.spring.websocket.controller;
  2. import org.springframework.messaging.handler.annotation.MessageMapping;
  3. import org.springframework.messaging.handler.annotation.SendTo;
  4. import org.springframework.web.bind.annotation.RestController;
  5. /**
  6. * @author dmz
  7. * @date Create in 12:37 2019/3/30
  8. */
  9. @RestController
  10. public class Controller {
  11. /**
  12. * 类似于我们的@requestMapping
  13. */
  14. @MessageMapping("/test")
  15. /**
  16. * 客户端通过app/test访问后,
  17. * 服务端会将数据发送到消息代理中
  18. */
  19. @SendTo("/topic/d1")
  20. public String test(String name) {
  21. return "hello webSocket," + name;
  22. }
  23. }
  1. package com.study.spring.websocket;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class WebsocketApplication {
  6. public static void main(String[] args) {
  7. SpringApplication.run(WebsocketApplication.class, args);
  8. }
  9. }
  1. 前端项目地址:https://github.com/daimingzhi/h5/tree/master/webSocket

spring学习笔记(八)webSocket的更多相关文章

  1. Java框架spring 学习笔记(十八):事务管理(xml配置文件管理)

    在Java框架spring 学习笔记(十八):事务操作中,有一个问题: package cn.service; import cn.dao.OrderDao; public class OrderSe ...

  2. go微服务框架kratos学习笔记八 (kratos的依赖注入)

    目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...

  3. 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展

    <Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...

  4. spring学习笔记(一) Spring概述

    博主Spring学习笔记整理大部分内容来自Spring实战(第四版)这本书.  强烈建议新手购入或者需要电子书的留言. 在学习Spring之前,我们要了解这么几个问题:什么是Spring?Spring ...

  5. Learning ROS forRobotics Programming Second Edition学习笔记(八)indigo rviz gazebo

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  6. Spring学习笔记2——表单数据验证、文件上传

    在上一章节Spring学习笔记1——IOC: 尽量使用注解以及java代码中,已经搭建了项目的整体框架,介绍了IOC以及mybatis.第二节主要介绍SpringMVC中的表单数据验证以及文件上传. ...

  7. 不错的Spring学习笔记(转)

    Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是s ...

  8. python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑

    python3.4学习笔记(八) Python第三方库安装与使用,包管理工具解惑 许多人在安装Python第三方库的时候, 经常会为一个问题困扰:到底应该下载什么格式的文件?当我们点开下载页时, 一般 ...

  9. 【Spring学习笔记-MVC-15.1】Spring MVC之异常处理=404界面

    作者:ssslinppp       异常处理请参考前篇博客:<[Spring学习笔记-MVC-15]Spring MVC之异常处理>http://www.cnblogs.com/sssl ...

  10. 【Spring学习笔记-MVC-13.2】Spring MVC之多文件上传

    作者:ssslinppp       1. 摘要 前篇文章讲解了单文件上传<[Spring学习笔记-MVC-13]Spring MVC之文件上传>http://www.cnblogs.co ...

随机推荐

  1. 传智博客2015年最新版iOS基础视频_最适合初学者入门

    视频介绍: 本视频是iOS学院精心录制的免费精华版iOS语言基础视频,该视频特点在于最大程度保证了知识点的完整性,按知识点进行视频录制,每个视频控制在20分钟左右,不会使学生产生疲劳,授课讲究通俗易懂 ...

  2. Python中有许多HTTP客户端,但使用最广泛且最容易的是requests

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:北京尚脑软件测试 PS:如有需要Python学习资料的小伙伴可以加点击 ...

  3. NK16

    C 小石的海岛之旅 链接:https://ac.nowcoder.com/acm/contest/949/C来源:牛客网 暑假到了,小石和小雨到海岛上玩. 从水平方向看海岛可以看成 nnn个小块,每一 ...

  4. SpringMVC Spring Mybatis整合篇

    1.创建WEB项目 创建项目:(ssmbuild)步骤略........ 给项目添加lib文件夹,用于存放jar包: 在WEB-INF目录下创建lib文件夹: 创建完成:运行项目时需要把jar导入到l ...

  5. SringMVC入门程序

    Spring MVC是Spring Framework的一部分,是基于Java实现MVC的轻量级Web框架 1.Spring优点 轻量级,简单易学 高效 , 基于请求响应的MVC框架 与Spring兼 ...

  6. JSP中引用CSS样式文件却无法显示的问题解决方案

    你也遇到过这种问题吗,CSS写好了,JSP写好了,在JSP中调用CSS文件,路径检查后也正确,但是无法显示渲染后的页面 原因:罪魁祸首就是过滤器响应数据的时候,响应头设置为了“text/html”,但 ...

  7. SpringBoot+Netty+WebSocket实现实时通信

    这篇随笔暂时不讲原理,首先搭建起一个简单的可以实现通信的Demo.之后的一系列随笔会进行一些原理上的分享. 不过在这之前大家最好了解一下Netty的线程模型和NIO编程模型,会对它的整体逻辑有所了解. ...

  8. ansible playbook loop 翻译

    ansible源文档地址 有时候你想多次重复一个任务. 在计算机编程中,这叫做循环. 常见的 Ansible 循环包括使用文件模块更改几个文件和 / 或目录的所有权,使用用户模块创建多个用户,并重复一 ...

  9. TensorFlow keras中一些著名的神经网络

  10. 【高并发】由InterruptedException异常引发的思考

    写在前面 InterruptedException异常可能没你想的那么简单! 前言 当我们在调用Java对象的wait()方法或者线程的sleep()方法时,需要捕获并处理InterruptedExc ...