美文网首页中间件JavaJava
Spring WebSocket初探1 (Spring WebS

Spring WebSocket初探1 (Spring WebS

作者: Devid | 来源:发表于2015-11-18 16:14 被阅读18453次

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

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

    基础环境

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

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

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

    相关配置

    下面我们来配置WebSocket。
    首先新增一个WebSocketConfig类,定义全局的配置信息,使用JavaConfig的形式:
    WebSocketConfig.java

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

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

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

    编写后台业务

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

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

    下面我们来实现:

    新建一个GreetingController

    @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换成另一种写法。

    @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入门教程)

    相关文章

      网友评论

      • 668d946090af:感谢分享,算是扫盲了
      • SamHxm:请问如何获取浏览器与服务端建立连接时发送的userid,我想给指定的客户端推送消息,但无法获得客户端的userid
        贝克街的流浪猫_3fb1:我觉得建立连接的时候就该记录哪个连接对应哪个用户了
        SamHxm: @蔚蓝色的大海_47ec 未
        a330ed678f37:你实现这个了吗?
      • 451e3a89d835:你好 我想用websocket来实现你画我猜 可是我该怎么实现多个玩家轮流作画呢
        望指教 :sob:
        0df55751a9e1:请问你实现了吗
      • joan_2:喜欢

      本文标题:Spring WebSocket初探1 (Spring WebS

      本文链接:https://www.haomeiwen.com/subject/zbhlhttx.html