前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring WebSocket初探1 (Spring WebSocket入门教程)

Spring WebSocket初探1 (Spring WebSocket入门教程)

作者头像
飞奔去旅行
发布2019-06-13 10:51:00
1.2K0
发布2019-06-13 10:51:00
举报
文章被收录于专栏:智慧协同

See more: Spring WebSocket reference 整个例子属于WiseMenuFrameWork的一部分,可以将整个项目Clone下来,如果朋友们有需求,我可以整理一个独立的demo出来。

WebSocket是html5带来的一项重大的特性,使得浏览器与服务端之间真正长连接交互成为了可能,这篇文章会带领大家窥探一下Spring 对WebSocket的支持及使用。

基础环境

快速搭建Spring框架,我们使用Spring boot,这里先不讨论SpringBoot,只知道它是一个“快速搭建Spring项目的一站式解决方案”就OK了。

要使用Spring的WebSocket功能,我们需要添加依赖:

代码语言:javascript
复制
<dependency>    
        <groupId>org.springframework.boot</groupId>    
        <artifactId>spring-boot-starter-websocket</artifactId>
</dependency>

这样就轻松开启了WebSocket基础功能。

相关配置

下面我们来配置WebSocket。

首先新增一个WebSocketConfig类,定义全局的配置信息,使用JavaConfig的形式:

WebSocketConfig.java

代码语言:javascript
复制
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {    
    @Override    
    public void registerStompEndpoints(StompEndpointRegistry registry) {        
        registry.addEndpoint("/socket").withSockJS();       
    }    
    @Override    
    public void configureMessageBroker(MessageBrokerRegistry registry) {  
        registry.enableSimpleBroker("/topic");      
        registry.setApplicationDestinationPrefixes("/app"); 
    }
}

相关说明:

  1. registerStompEndpoints(StompEndpointRegistry registry) 这个方法的作用是添加一个服务端点,来接收客户端的连接。
  2. registry.addEndpoint("/socket")表示添加了一个/socket端点,客户端就可以通过这个端点来进行连接。
  3. withSockJS()的作用是开启SockJS支持,
  4. configureMessageBroker(MessageBrokerRegistry config) 这个方法的作用是定义消息代理,通俗一点讲就是设置消息连接请求的各种规范信息。
  5. registry.enableSimpleBroker("/topic")表示客户端订阅地址的前缀信息,也就是客户端接收服务端消息的地址的前缀信息(比较绕,看完整个例子,大概就能明白了)
  6. registry.setApplicationDestinationPrefixes("/app")指服务端接收地址的前缀,意思就是说客户端给服务端发消息的地址的前缀

上面两个方法定义的信息其实是相反的,一个定义了客户端接收的地址前缀,一个定义了客户端发送地址的前缀

到目前为止,整个框架的配置信息已经完成,下面我们来写一个发送公告的例子,展示一下WebSocket的魅力!

编写后台业务

有了上述的基本配置信息,我们就可以编写基本功能了。这里先简单说明两个知识点:

  1. MessageMapping Spring对于WebSocket封装的特别简单,提供了一个@MessageMapping注解,功能类似@RequestMapping,它是存在于Controller中的,定义一个消息的基本请求,功能也跟@RequestMapping类似,包括支持通配符的url定义等等,详细用法参见Annotation Message Handling
  2. SimpMessagingTemplate SimpMessagingTemplate是Spring-WebSocket内置的一个消息发送工具,可以将消息发送到指定的客户端。

下面我们来实现:

新建一个GreetingController

代码语言:javascript
复制
@Controller
public class GreetingController {    
    @Resource
    private SimpMessagingTemplate simpMessagingTemplate;    
    @RequestMapping("/helloSocket")    
    public String index(){        
        return "/hello/index";    
    }    
    @MessageMapping("/change-notice")    
    public void greeting(String value){
        this.simpMessagingTemplate.convertAndSend("/topic/notice", value);    
    }
}

相关说明:

  1. index() 指定了一个页面,用来实现WebSocket客户端发送公告功能,使用的是@RequestMapping,所以接收的是http请求,进行页面跳转。
  2. greeting(String value) 这个方法是接收客户端发送功公告的WebSocket请求,使用的是@MessageMapping
  3. this.simpMessagingTemplate.convertAndSend("/topic/notice", value) 这个方法官方给出的解释是Convert the given Object to serialized form, possibly using a MessageConverter, wrap it as a message and send it to the given destination. 意思就是“将给定的对象进行序列化,使用‘MessageConverter’进行包装转化成一条消息,发送到指定的目标”,通俗点讲就是我们使用这个方法进行消息的转发发送!

前面我们全局配置中指定了服务端接收的连接以 app大头,所以客户端发送公告的请求连接应该是/app/change-notice

服务端代码就这么简单,跟写SpringMVC类似,同样上面的geeting(String value)方法我们还可以使用另一个注解@SendTo换成另一种写法。

代码语言:javascript
复制
@MessageMapping("/change-notice")
@SendTo("/topic/notice")
public String greeting(String value) {    
    return value;
}

相关说明: 改进后的代码更简单,着重理解一下@SendTo

  • @SendTo定义了消息的目的地。结合例子解释就是“接收/app/change-notice发来的value,然后将value转发到/topic/notice客户端。
  • /topic/notice是客户端发起连接后,订阅服务端消息时指定的一个地址,用于接收服务端的返回,后面我们在写客户端代码的时候会看见。

到目前为止,服务端代码Coding完毕!下一篇文章我们来写客户端功能。

传送门:Spring WebSocket初探2 (Spring WebSocket入门教程)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015.11.18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 基础环境
  • 相关配置
  • 编写后台业务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档