zoukankan      html  css  js  c++  java
  • 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);
        }
    }
    
    
    1. 前端项目地址:https://github.com/daimingzhi/h5/tree/master/webSocket
  • 相关阅读:
    Spring注解驱动开发(二)--组件注入
    Spring注解驱动开发(一)--项目搭建
    Font "微软雅黑" is not available to the JVM. See the Javadoc for more details.
    idea下远程debug调试
    JasperReport生成PDF文件
    Java获取系统属性和环境变量
    oracle date change
    winform webbrowser flash显示
    uploadify参数
    对COM 组件的调用返回了错误 HRESULT E_FAIL
  • 原文地址:https://www.cnblogs.com/daimzh/p/12854468.html
Copyright © 2011-2022 走看看