spring boot下 的WebSocket

一.什么是WebSocket

WebSocket为浏览器和服务端提供了双工异步通信的功能,即浏览器可以向服务端发送消息,服务端也可以向浏览器发送消息。WebSocket需要浏览器支持,如IE10+,Chrome 13+,Firefox 6+.

WebSocket是通过一个socket来实现双工异步通信的。但是直接使用WebSocket(或者SockJS:WebSocket协议的模拟,增加了当浏览器不支持WebSocket的时候的兼容支持)协议开发程序显得特别繁琐,我们使用它的子协议STOMP,更高级的协议,STOMP协议使用一个基于帧(frame)的格式来定义消息。

Spring boot对 内嵌的Tomcat,Jetty和Undertow使用了WebSocket提供了支持.

spring boot为WebSocket提供的stater pom是spring-boot-starter-websocket

二.实战

1.准备,新建spring boot项目,选择Thymeleaf和Websocket依赖

2.广播式

广播式即服务端有消息时,会将消息发送给所有连接了当前endpoint的浏览器。

(1)配置WebSocket,代码如下:

package com.zl.demo;

import org.springframework.context.annotation.Configuration;

import org.springframework.messaging.simp.config.MessageBrokerRegistry;

import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;

import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;

import org.springframework.web.socket.config.annotation.StompEndpointRegistry;

/**

* 广播式:服务端有消息时,会将消息发送给当前endpoint的浏览器

* (1)配置websocket  需要在配置类上使用@EnableWebSocketMessageBroker,开启支持

* ,并通过继承AbstractWebSocketMessageBrokerConfigurer,重写其方法来配置webSocket

* @author zhangliang

*

*/

@Configuration

@EnableWebSocketMessageBroker  //开启使用stomp协议来传输消息

public class WebSocketConfig  extends AbstractWebSocketMessageBrokerConfigurer{

@Override

public void registerStompEndpoints(StompEndpointRegistry registry) { //注册stomp协议节点,映射指定的url

      registry.addEndpoint("endpointZL").withSockJS();  //注册一个STOMP的endpoint,并指定SockJS协议

}

@Override

public void configureMessageBroker(MessageBrokerRegistry registry) {//配置消息代理

registry. enableSimpleBroker("/topic");          //广播式应配置一个/topic消息代理

}

}

(2)浏览器向服务端发送的消息用此类接受:

package com.zl.demo.domain;

/**

* 浏览器向服务端发送消息用此类接受

* @author zhangliang

*

*/

public class ZLMessgae {

  private String name;


  public String getName() {

return name;

}

}

(3)服务端向浏览器发送的此类的消息

package com.zl.demo.domain;

/**

* 服务端向浏览器发送此类消息

*

* @author zhangliang

*

*/

public class ZLResponse {

private String responseMessage;

public ZLResponse(String responseMessage) {

super();

this.responseMessage = responseMessage;

}

public String getResponseMessage() {

return responseMessage;

}

}

(4)控制器

package com.zl.demo.controller;

import org.springframework.messaging.handler.annotation.MessageMapping;

import org.springframework.messaging.handler.annotation.SendTo;

import org.springframework.stereotype.Controller;

import com.zl.demo.domain.ZLMessgae;

import com.zl.demo.domain.ZLResponse;

/**

* 控制器

* @author zhangliang

*

*/

@Controller

public class WsController {

@MessageMapping("/welcome")  //映射

@SendTo("/topic/getResponse")  //当服务器有消息会向订阅@SendTo路径的浏览器发送消息

public ZLResponse say(ZLMessgae messgae) throws Exception  {

Thread.sleep(3000);

return new ZLResponse("Welcome,"+messgae.getName()+"!");

}

}

(5)添加js脚本stomp.min.js,sockjs.main.js,jquery.min.js,在下面地址可以找到最新版本

http://www.bootcdn.cn/stomp.js/

http://www.bootcdn.cn/sockjs-client/

http://www.bootcdn.cn/jquery/

(6)演示页面,在src/main/resources/templates下新建ws.html

地址:https://blog.csdn.net/u013205151/article/details/80699097

(7)配置viewController

package com.zl.demo;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;

import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@SpringBootApplication

public class SpringBootDemoApplication extends WebMvcConfigurerAdapter{

public static void main(String[] args) {

SpringApplication.run(SpringBootDemoApplication.class, args);

}

@Override

public void addViewControllers(ViewControllerRegistry registry) {

  registry.addViewController("/ws").setViewName("ws");

}

}

(8)运行,多开几个窗口,访问http://localhost:8080/ws,然后分别连接上服务器,然后一个浏览器发送消息,其他浏览器都能接受。正常。

你可能感兴趣的:(spring boot下 的WebSocket)