spring websocket 5.05 基于stomp协议

WebSocket协议定义了两种类型的消息,文本和二进制,但其内容未定义。 为客户端和服务器定义了一种协商子协议的机制 - 即更高级别的消息传递协议,用于在WebSocket之上定义每种消息可以发送哪种消息,每种消息的格式和内容是什么等等 上。 子协议的使用是可选的,但是客户端和服务器需要就定义消息内容的一些协议达成一致。


STOMP是一种简单的面向文本的消息传递协议,最初是为脚本语言(如Ruby,Python和Perl)创建的,用于连接企业消息代理。 它旨在解决常用消息传递模式的最小子集。 STOMP可用于任何可靠的双向流媒体网络协议,如TCP和WebSocket。 尽管STOMP是一种面向文本的协议,但消息负载可以是文本或二进制。


STOMP是一个基于帧的协议,其帧在HTTP上建模。 STOMP框架的结构:




客户可以使用SEND或SUBSCRIBE命令发送或订阅消息以及描述消息的内容和由谁来接收消息的“目标”头。这使得一个简单的发布 - 订阅机制可以用来通过代理发送消息到其他连接的客户端,或者发送消息到服务器来请求执行一些工作。


在使用Spring的STOMP支持时,Spring WebSocket应用程序充当客户端的STOMP代理。消息被路由到@Controller消息处理方法或一个简单的内存代理,用于跟踪订阅并向订阅用户广播消息。您还可以将Spring配置为与专用的STOMP代理(例如RabbitMQ,ActiveMQ等)一起使用,以用于消息的实际广播。在这种情况下,Spring维护与代理的TCP连接,将消息转发给它,并将消息从它传递到连接的WebSocket客户端。因此,Spring Web应用程序可以依靠统一的基于HTTP的安全性,通用验证以及熟悉的编程模型消息处理工作。


这里是客户订阅接收股票报价的例子,服务器可以定期发送例如通过计划任务通过SimpMessagingTemplate将消息发送给代理:



以下是客户端发送交易请求的示例,服务器可以通过@MessageMapping方法处理,稍后在执行后向客户端广播交易确认消息和详细信息:



目的地的含义在STOMP规范中有意不透明。 它可以是任何字符串,完全取决于STOMP服务器来定义它们支持的目的地的语义和语法。 然而,对于目的地是类似路径的字符串,其中“/ topic / ..”意味着发布 - 订阅(一对多)和“/队列/”意味着点对点(一对一 )消息交换。


STOMP服务器可以使用MESSAGE命令向所有用户广播消息。 以下是向订阅客户端发送股票报价的服务器示例:


知道服务器不能发送未经请求的消息很重要。 所有来自服务器的消息都必须响应特定的客户端订阅,并且服务器消息的“subscription-id”头必须与客户端订阅的“id”头相匹配。


以上概述旨在提供对STOMP协议的最基本的了解。 建议全面查看协议规范。

使用STOMP作为子协议使Spring Framework和Spring Security能够提供更丰富的编程模型,而不是使用原始WebSockets。 关于HTTP与原始TCP的关系以及Spring MVC和其他Web框架如何提供丰富的功能都可以做到这一点。 以下是一些好处:
不需要发明自定义消息协议和消息格式。
STOMP客户端可用,包括Spring框架中的Java客户端。
消息代理(如RabbitMQ,ActiveMQ等)可以用于(可选)管理订阅和广播消息。
应用程序逻辑可以组织在任何数量的@ Controller中,并且根据STOMP目标报头路由到他们的消息,以及用给定连接的单个WebSocketHandler处理原始WebSocket消息。

使用Spring Security来保护基于STOMP目标和消息类型的消息。

spring-messaging和spring-websocket模块提供了对WebSocket支持的STOMP。 一旦你有这些依赖关系,你可以通过WebSocket和SockJS Fallback公开一个STOMP端点,如下所示:

WebSocketConfig配置:

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.converter.MessageConverter;
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 com.dougong.socket.handler.MyWebSocketHandlerDecoratorFactory;
import com.dougong.socket.interceptor.HandshakeInterceptor;




@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer{


@Autowired
private MyWebSocketHandlerDecoratorFactory decoratorFactory;

/**
* applicationDestinationPrefixes应用前缀,所有请求的消息将会路由到@MessageMapping的controller上,
* enableStompBrokerRelay是代理前缀,而返回的消息将会路由到代理上,所有订阅该代理的将收到响应的消息。

*/
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
// 应用程序以/app为前缀,代理目的地以/topic、/user为前缀

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值