Spring Boot WebSocket从入门到放弃

在构建Spring boot项目时已经提供webSocket依赖的勾选。

 

webSocket是TCP之上的一个非常薄的轻量级层 ,webSocket主要的应用场景离不开即时通讯与消息推送,但只要应用程序需要在浏览器和服务器之间来回发送消息,就可以使用webSocket来降低客户端流量与服务器的负载。

 

下面将基于Spring boot实现一个非常简单的HelloWorld程序,用来熟悉项目构建逻辑。

 

1.导入依赖

 

主要的webSocket依赖

Copy

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

一些js库依赖,这里也使用maven方式导入,官网https://www.webjars.org/

 

Copy

       <dependency>
           <groupId>org.webjars</groupId>
           <artifactId>webjars-locator-core</artifactId>
       </dependency>
       <dependency>
           <groupId>org.webjars</groupId>
           <artifactId>sockjs-client</artifactId>
           <version>1.0.2</version>
       </dependency>
       <dependency>
           <groupId>org.webjars</groupId>
           <artifactId>stomp-websocket</artifactId>
           <version>2.3.3</version>
       </dependency>
       <dependency>
           <groupId>org.webjars</groupId>
           <artifactId>bootstrap</artifactId>
           <version>3.3.7</version>
       </dependency>
       <dependency>
           <groupId>org.webjars</groupId>
           <artifactId>jquery</artifactId>
           <version>3.1.0</version>
       </dependency>

Thymeleaf模板引擎,不用多说了吧

 

Copy

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

 

2.配置开启

 

接下来开启webSocket并配置一番

 

 

Copy

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {

   @Override
   public void registerStompEndpoints(StompEndpointRegistry registry) {
       registry.addEndpoint("/gs-guide-websocket").withSockJS();
   }
   
   @Override
   public void configureMessageBroker(MessageBrokerRegistry config) {
       config.enableSimpleBroker("/topic");
       config.setApplicationDestinationPrefixes("/app");
   }

}

 

这里从上向下说一下,

 

1)@EnableWebSocketMessageBroker注解用于开启使用STOMP协议来传输基于代理(MessageBroker)的消息,这时候控制器(controller)开始支持@MessageMapping,就像是使用@requestMapping一样。

 

2)registerStompEndpoints()方法只写了一行代码:

Copy

 

registry.addEndpoint("/gs-guide-websocket").withSockJS();

 

一是用来注册一个Stomp的节点(endpoint),也就是webSocket的服务端地址,客户端在链接时使用到;

 

二是withSockJs()方法指定使用SockJS协议。SockJs是一个WebSocket的通信js库,Spring对这个js库进行了后台的自动支持,如果使用它不需要进行过多配置。

 

3)配置消息代理(MessageBroker),该方法干了两件事,一是启用一个简单的message broker并配置一个或多个前缀来过滤针对代理的目的地(例如以“/topic”为前缀的目的地),该前戳限制了网页客户端设置本地地址时的前戳。

 

二是设置了一个客户端访问服务端地址的前缀。比如我们设置@MessageMapping("/hello"),那客户端要发送消息到服务器上的地址是 /app/hello。

 

3.提供接口

 

Copy

@Controller
public class GreetingController {

   @MessageMapping("/hello")
   @SendTo("/topic/greetings")
   public Greeting greeting(HelloMessage message) throws Exception {
       System.out.println("收到:" + message.toString() + "消息");
       return new Greeting("Hello, " + HtmlUtils.htmlEscape(message.getName()) + "!");
   }

 

1)@MessageMapping和@RequestMapping功能类似,用于设置URL映射地址,浏览器向服务器发起请求,需要通过该地址。

 

需要注意,这里设置路径为/hello,但是客户端需要访问/app/hello,原因前面已经讲述。

 

2)@SendTo("/topic/greetings") 设置目的地,这里的目的地是站在服务端的角度对客户端而言。客户端也需要设置相同的地址,而且必须使用/topic前戳,前面也已经讲述。

 

本示例中如果服务器接受到了消息,就会对订阅了@SendTo括号中的地址传送消息。

 

备注:HtmlUtils.htmlEscape()方法会将特殊字符转换为HTML字符引用。

HelloMessage.java

 

Copy

public class HelloMessage {
   private String name;
   ...
}

Greeting.java

 

Copy

public class Greeting {
   private String content;
}

 

4.客户端

 

在resources/stat

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值