zoukankan      html  css  js  c++  java
  • Spring WebSocket入门(一) 转载

    本文转载自: http://www.jianshu.com/p/60799f1356c5

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

    1. 基础环境

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

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

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

    2. 相关配置

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

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

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

    3. 编写后台业务

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

    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完毕!下一篇文章我们来写客户端功能。

  • 相关阅读:
    通过反射获取Android通知栏高度
    Android 的EditText实现不可编辑
    Android 代码混淆、第三方平台加固加密、渠道分发 完整教程(图文)
    eclipse、myeclipse,svn插件subclipse 忘记密码的解决方法(win7、win8、xp)
    Eclipse 基于接口编程的时候,快速跳转到实现类的方法(图文)
    WIN7、WIN8 右键在目录当前打开命令行Cmd窗口(图文)
    eclipse,myeclipse开发环境下,maven远程部署到tomcat7服务器(图文)
    python之路——博客目录
    生成器和协程 —— 你想知道的都在这里了
    python3.7导入gevent模块报错的解决方案
  • 原文地址:https://www.cnblogs.com/mr-wuxiansheng/p/7103567.html
Copyright © 2011-2022 走看看