spring学习笔记(八)webSocket

简介: spring学习笔记(八)webSocket

知识储备


1.什么是stomp?


我们可以类比TCP与Http协议,我们知道Http协议是基于TCP协议的,Http协议解决了 web 浏览器发起请求以及 web 服务器响应请求的细节,我们在编码时候只要关注我们要发送或接受的信息就行了,不需要关注那些细节

直接使用 WebSocket(SockJS) 就很类似于 使用 TCP 套接字来编写 web 应用;因为没有高层协议,因此就需要我们定义应用间所发送消息的语义,还需要确保连接的两端都能遵循这些语义;

同 HTTP 在 TCP 套接字上添加 请求-响应 模型层一样,STOMP 在 WebSocket 之上提供了一个基于 帧的线路格式层,用来定义消息语义;


2.STOMP帧格式


基本格式

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

项目代码


1.后台代码如下,主要的分析我都写在注释里了

package com.study.spring.websocket.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.converter.MessageConverter;
import org.springframework.messaging.handler.invocation.HandlerMethodArgumentResolver;
import org.springframework.messaging.handler.invocation.HandlerMethodReturnValueHandler;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketTransportRegistration;
import java.util.List;
/**
 * @author dmz
 * @date Create in 12:37 2019/3/30
 */
@Configuration
/**
 * 通过这个注解,开启使用STOMP来传输基于message broker
 * 的小心,这时的控制器支持@MessageMapping,就像@RequestMapping
 */
@EnableWebSocketMessageBroker
public class Config implements WebSocketMessageBrokerConfigurer {
    /**
     * 注册STOMP端点,映射指定的url
     * 端点的作用——客户端在订阅或发布消息 到目的地址前,要连接该端点
     *
     * @param registry
     */
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/stomp").
                /**
                 * 设置允许所有域名访问
                 */
                        setAllowedOrigins("*").
                /**
                 * 许多浏览器不支持 WebSocket 协议;
                 * SockJS 是 WebSocket 技术的一种模拟。SockJS 会 尽可能对应 WebSocket API,
                 * 但如果 WebSocket 技术 不可用的话,就会选择另外的 通信方式协议;
                 */
                        withSockJS();
    }
    /**
     * 配置消息代理
     * 如果不重载它的话,将会自动配置一个简单的内存消息代理,用它来处理以"/topic"为前缀的消息
     *
     * @param registry
     */
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.enableSimpleBroker("/topic", "/queue");
        registry.setApplicationDestinationPrefixes("/app");
        //基于RabbitMQ 的STOMP消息代理
//        registry.enableStompBrokerRelay("/queue", "/topic")
//                .setRelayHost(host)
//                .setRelayPort(port)
//                .setClientLogin(userName)
//                .setClientPasscode(password);
    }
    @Override
    public void configureWebSocketTransport(WebSocketTransportRegistration registry) {
    }
    @Override
    public void configureClientInboundChannel(ChannelRegistration registration) {
    }
    @Override
    public void configureClientOutboundChannel(ChannelRegistration registration) {
    }
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
    }
    @Override
    public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
    }
    @Override
    public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
        return false;
    }
}
package com.study.spring.websocket.controller;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author dmz
 * @date Create in 12:37 2019/3/30
 */
@RestController
public class Controller {
    /**
     * 类似于我们的@requestMapping
     */
    @MessageMapping("/test")
    /**
     * 客户端通过app/test访问后,
     * 服务端会将数据发送到消息代理中
     */
    @SendTo("/topic/d1")
    public String test(String name) {
        return "hello webSocket," + name;
    }
}
package com.study.spring.websocket;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class WebsocketApplication {
    public static void main(String[] args) {
        SpringApplication.run(WebsocketApplication.class, args);
    }
}
package com.study.spring.websocket;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class WebsocketApplication {
    public static void main(String[] args) {
        SpringApplication.run(WebsocketApplication.class, args);
    }
}

2.前端项目地址:https://github.com/daimingzhi/h5/tree/master/webSocket

相关文章
|
4天前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
24 9
|
4天前
|
前端开发 Java C++
RSocket vs WebSocket:Spring Boot 3.3 中的两大实时通信利器
本文介绍了在 Spring Boot 3.3 中使用 RSocket 和 WebSocket 实现实时通信的方法。RSocket 是一种高效的网络通信协议,支持多种通信模式,适用于微服务和流式数据传输。WebSocket 则是一种标准协议,支持全双工通信,适合实时数据更新场景。文章通过一个完整的示例,展示了如何配置项目、实现前后端交互和消息传递,并提供了详细的代码示例。通过这些技术,可以大幅提升系统的响应速度和处理效率。
|
5天前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
15 1
|
9天前
|
Java 测试技术 开发者
springboot学习四:Spring Boot profile多环境配置、devtools热部署
这篇文章主要介绍了如何在Spring Boot中进行多环境配置以及如何整合DevTools实现热部署,以提高开发效率。
27 2
|
9天前
|
前端开发 Java 程序员
springboot 学习十五:Spring Boot 优雅的集成Swagger2、Knife4j
这篇文章是关于如何在Spring Boot项目中集成Swagger2和Knife4j来生成和美化API接口文档的详细教程。
24 1
|
9天前
|
Java API Spring
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中拦截器的入门教程和实战项目场景实现的详细指南。
13 0
springboot学习七:Spring Boot2.x 拦截器基础入门&实战项目场景实现
|
9天前
|
Java API Spring
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
这篇文章是关于Spring Boot 2.x中过滤器的基础知识和实战项目应用的教程。
12 0
springboot学习六:Spring Boot2.x 过滤器基础入门&实战项目场景实现
|
9天前
|
Java 关系型数据库 MySQL
springboot学习五:springboot整合Mybatis 连接 mysql数据库
这篇文章是关于如何使用Spring Boot整合MyBatis来连接MySQL数据库,并进行基本的增删改查操作的教程。
14 0
springboot学习五:springboot整合Mybatis 连接 mysql数据库
|
9天前
|
Java 关系型数据库 MySQL
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
这篇文章是关于如何使用Spring Boot框架通过JdbcTemplate操作MySQL数据库的教程。
11 0
springboot学习四:springboot链接mysql数据库,使用JdbcTemplate 操作mysql
|
9天前
|
Java 测试技术 Spring
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件
这篇文章介绍了Spring Boot中配置文件的语法、如何读取配置文件以及如何通过静态工具类读取配置文件。
16 0
springboot学习三:Spring Boot 配置文件语法、静态工具类读取配置文件、静态工具类读取配置文件