websocket只定义了文字和字节俩种形式的消息格式,没有像http协议那样子有那么丰富的协议规范,我们看看http的协议格式
websocket之所以没有自己定义那么多的协议格式,是希望有框架自己来实现定义这些格式,我们称之为websocket的子协议,sub-protocol。
STOMP,Streaming Text Orientated Message Protocol,是流文本定向消息协议,是一种为MOM(Message Oriented Middleware,面向消息的中间件)设计的简单文本协议。STOMP的消息格式如下:
COMMAND
header1:value1
header2:value2
Body^@
例如发送消息
destination:/
queue
/trade
content
-type
:application/json
content
-length
:
44
{
"action"
:
"BUY"
,
"ticker"
:
"MMM"
,
"shares"
,
44
}^@
再看看订阅消息
SUBSCRIBE
id:sub-1
destination:/topic/price.stock.*
然后服务器进行广播消息
MESSAGE
message-id:nxahklf6-1
subscription:sub-1
destination:/topic/price.stock.MMM
{"ticker":"MMM","price":129.45}^@
详细了解可以看看官网http://stomp.github.io/stomp-specification-1.1.html
spring websocket利用STOMP作为websocket的子协议,原因是stomp可以提供一种类似springmvc的编码方式,可以利用注解进行接收和发送消息以及和springmvc进行无缝的结合。
这样子,我们利用注解来接受和广播websocket信息
@Controller
@RequestMapping("/webSocket")
@MessageMapping("foo")
public class WebSocketController {
@MessageMapping("handle")
@SendTo("/topic/greetings")
public String handle(Task task ,String name) {
return "handle2";
@MessageMapping即可以用来类级别上也可以用在方法级别上,类似springmvc,但是为不同的是,springmvc的路径是类路径/方法路径,中间是“/”,例如/webSocket/xxxx,而websocket是用“.”来分开路径的,类路径.方法路径,例如foo.handle来发送消息到特定路径
@SendTo可以把消息广播到路径上去,例如上面可以把消息广播到”/topic/greetings”,如果客户端在这个路径订阅消息,则可以接收到消息
接下来需要注册下基于stomp子协议的websocket到spring中
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketMessageBrokerConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/portfolio-stomp").withSockJS();
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.enableSimpleBroker("/topic");
registry.setApplicationDestinationPrefixes("/app");
registry.setPathMatcher(new AntPathMatcher("."));
@Override
public boolean configureMessageConverters(List<MessageConverter> messageConverters) {
return true;
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registry) {
registry.addDecoratorFactory(new MyWebSocketHandlerDecoratorFactory());
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.setInterceptors(new MyChannelInterceptor());
@Override
public void configureClientOutboundChannel(ChannelRegistration registration) {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
@Override
public void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {
前端需要用到sockjs.js和stomp.js
var socket = new SockJS('/whats/portfolio-stomp');
* 建立成功的回调函数
socket.onopen = function() {
console.log('open');
* 服务器有消息返回的回调函数
socket.onmessage = function(e) {
console.log('message', e.data);
* websocket链接关闭的回调函数
socket.onclose = function() {
console.log('close');
var stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
stompClient.subscribe('/topic/greetings', function(data) {
$("#ret").text(data);
document.getElementById("ws").onclick = function() {
stompClient.send("/app/foo.handle3", {}, JSON.stringify({
name : "nane",
taskName : "taskName",
taskDetail : "taskDetail"
到这里就可以就服务器就可以接收和广播消息了,而客户端就可以发送和订阅消息了。
类中的handle的方法参数绑定接收和格式化的处理类似springmvc中方法参数的处理
而方法参数的返回值会被MessageConverter进行转化封装然后发送给广播出去,类似springmvc的方法中带@responsebody注解时候方法返回值会被httpMessageConverter进行转化一样。
spring websocket的方法参数中还允许有其他一些参数如下
Principal principal ,存放用户的登录验证信息
Message message,最基础的消息体,里面方有header和payload等信息
@Payload 消息体内容
@Header(“..”) 某个头部key的值
@Headers, 所有头部key的map集合
MessageHeaders , SimpMessageHeaderAccessor, MessageHeaderAccessor ,StompHeaderAccessor 消息头信息
@DestinationVariable 类似springmvc中的@PathVariable
在spring websocket中也可以类似springmvc中把变量绑定在路径上,例如
@MessageMapping("bar.{baz}")
@SendTo("/topic/greetings")
public String handle1(@DestinationVariable String baz) {
return baz;
这就是注解大概的使用方式,如何已注解方式来进行精准推送和全部推送呢??
websocket只定义了文字和字节俩种形式的消息格式,没有像http协议那样子有那么丰富的协议规范,我们看看http的协议格式websocket之所以没有自己定义那么多的协议格式,是希望有框架自己来实现定义这些格式,我们称之为websocket的子协议,sub-protocol。STOMP,Streaming Text Orientated Message Protocol,是流文本定向消息协议,
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</depen...
WebSocket 是 HTML5 一种新的协议。它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽并达到实时通讯,它建立在 TCP 之上,同 HTTP 一样通过 TCP 来传输数据,但是它和 HTTP 最大不同是:
WebSocket 是一种双向通信协议,在建立连接后,WebSocket 服务器和 Browser/Client Agent 都能主动的向对方发送或接收数据,就像 Soc
SpringBoot整合WebSocket服务 springboot整合websocket springboot使用websocket springboot使用websocket
1、websocket处理器
import org.apache.commons.collections.MapUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import...
spring框架中自带了websocket的jar包,利用它可以实现与H5中WebSocket的对接,甚至websocket还可以通过依赖注入与http请求一同工作,详细配置实现过程如下
文件目录结构如下,主要是controller和websocket文件夹1.配置自动扫描加载:<!--如果使用注解,那么只需要下面的配置-->
<!--组件扫描-->
<context:component-scan
不同上文Spring Boot系列十七 Spring Boot 集成 websocket,使用RabbitMQ做为消息代理,本文我们介绍通过Spring websocket实现向特定的用户发送消息。
本文的内容如下:
1. 首先实现简单的登录功能,这里向特定用户发送消息的必要条件
2. 用户登录系统后,才可以登录websocket,并重写MyPrincipal...
什么是stomp?
我们可以类比TCP与Http协议,我们知道Http协议是基于TCP协议的,Http协议解决了 web 浏览器发起请求以及 web 服务器响应请求的细节,我们在编码时候只要关注我们要发送或接受的信息就行了,不需要关注那些细节
直接使用 WebSocket(SockJS) 就很类似于 使用 TCP 套接字来编写 web 应用;因为没有高层协议,因此就需要我们定义应用...
前言关于Springboot中WebSocket的介绍这里就不赘述了。网上还是有比较多的介绍。本文主要解决的问题是广播消息(某个主题的),特定用户的消息发送。废话不多说,开始我们的实现。环境这里只罗列核心的技术点。
jdk :1.8
maven :3.X
Spring boot:1.5.2.RELEASE
WebSocket:spring-boot-starter-web
1.什么是WebSocket?
WebSocket 是 HTML5 的一种新协议,不同于http协议,WebSocket实现了客户端与服务器端的全双工通信,即允许服务器端主动推送消息给客户端。
2.为什么需要WebSocket?
因为Http协议做不到。 选取了我认为比较好的解释,摘自廖雪峰的官方网站,如下:
为什么传统的HTTP协议不能做到WebSocket实现的功能?
这是因为HTTP协议是...