zoukankan      html  css  js  c++  java
  • Spring WebSocket教程(一)

    学习背景

    很久以前就知道WebSocket,但那时不论是浏览器还是开发技术对它的支持都还很少。但是,Spring4突然发布,让我眼前一亮,Spring4直接支持WebSocket。
    对于Spring我还是很喜欢的,它让Java Web开发相当的有艺术感,这次支持的WebSocket又特别的和我的胃口,所以马上就去学习了。

    前提

    本文的内容,是建立在懂J2EE编程,使用过Spring,听说过WebSocket上的,如果前面的3点大家不太明白,可以先去补补知识。
    WebSocket还不是很普遍,对服务器和浏览器都有要求,不过使用了下面的一些技术,可以将浏览器的要求降低,但是服务器容器的要求还是比较高的,具体哪些服务器容易支持了WebSocket可以百度一下。

    第一步:配置Spring

    如果你跟我一样采用的Maven,那么只需要将下面的几个依赖,加入到pom.xml文件就可以了:
    [html] view plain copy
     
    1. <properties>  
    2.     <spring.version>4.0.0.RELEASE</spring.version>  
    3. </properties>  
    4.   
    5. <dependencies>  
    6.     <!--spring MVC-->  
    7.     <dependency>  
    8.         <groupId>org.springframework</groupId>  
    9.         <artifactId>spring-core</artifactId>  
    10.         <version>${spring.version}</version>  
    11.     </dependency>  
    12.   
    13.     <dependency>  
    14.         <groupId>org.springframework</groupId>  
    15.         <artifactId>spring-web</artifactId>  
    16.         <version>${spring.version}</version>  
    17.     </dependency>  
    18.   
    19.     <dependency>  
    20.         <groupId>org.springframework</groupId>  
    21.         <artifactId>spring-webmvc</artifactId>  
    22.         <version>${spring.version}</version>  
    23.     </dependency>  
    24.   
    25.     <!-- jstl -->  
    26.     <dependency>  
    27.         <groupId>jstl</groupId>  
    28.         <artifactId>jstl</artifactId>  
    29.         <version>1.2</version>  
    30.     </dependency>  
    31.   
    32.     <!--spring测试框架-->  
    33.     <dependency>  
    34.         <groupId>org.springframework</groupId>  
    35.         <artifactId>spring-test</artifactId>  
    36.         <version>${spring.version}</version>  
    37.         <scope>test</scope>  
    38.     </dependency>  
    39.   
    40.     <!--spring数据库操作库-->  
    41.     <dependency>  
    42.         <groupId>org.springframework</groupId>  
    43.         <artifactId>spring-jdbc</artifactId>  
    44.         <version>${spring.version}</version>  
    45.     </dependency>  
    46.   
    47.     <dependency>  
    48.         <groupId>junit</groupId>  
    49.         <artifactId>junit</artifactId>  
    50.         <version>4.8.2</version>  
    51.         <scope>test</scope>  
    52.     </dependency>  
    53.   
    54.     <!--spring websocket库-->  
    55.     <dependency>  
    56.         <groupId>org.springframework</groupId>  
    57.         <artifactId>spring-websocket</artifactId>  
    58.         <version>${spring.version}</version>  
    59.     </dependency>  
    60.     <dependency>  
    61.         <groupId>org.springframework</groupId>  
    62.         <artifactId>spring-messaging</artifactId>  
    63.         <version>${spring.version}</version>  
    64.     </dependency>  
    65.   
    66.     <!--jackson用于json操作-->  
    67.     <dependency>  
    68.         <groupId>com.fasterxml.jackson.core</groupId>  
    69.         <artifactId>jackson-databind</artifactId>  
    70.         <version>2.3.0</version>  
    71.     </dependency>  
    72.   
    73.     <dependency>  
    74.         <groupId>commons-fileupload</groupId>  
    75.         <artifactId>commons-fileupload</artifactId>  
    76.         <version>1.2.2</version>  
    77.     </dependency>  
    78.     <dependency>  
    79.         <groupId>commons-io</groupId>  
    80.         <artifactId>commons-io</artifactId>  
    81.         <version>2.2</version>  
    82.     </dependency>  
    83.     <!--使用阿里的连接池-->  
    84.     <dependency>  
    85.         <groupId>com.alibaba</groupId>  
    86.         <artifactId>druid</artifactId>  
    87.         <version>1.0.4</version>  
    88.     </dependency>  
    89.     <!--mysql connector-->  
    90.     <dependency>  
    91.         <groupId>mysql</groupId>  
    92.         <artifactId>mysql-connector-java</artifactId>  
    93.         <version>5.1.29</version>  
    94.     </dependency>  
    95.   
    96. </dependencies>  

    Spring的配置我就不一一贴出来了,可以去github看,地址我会贴在下面。

    第二步:配置WebSocket

    我采用的是使用Configurer类和 Annotation来进行WebSocket配置。
    首先要创建一个类,继承WebSocketMessageBrokerConfigurer,并且在类上加上annotation:@Configuration和@EnableWebSocketMessageBroker。这样,Spring就会将这个类当做配置类,并且打开WebSocket。
    [java] view plain copy
     
    1. @Configuration  
    2. @EnableWebSocketMessageBroker  
    3. public class WebSocketConfig implements WebSocketMessageBrokerConfigurer{  
    4.     @Override  
    5.     public void registerStompEndpoints(StompEndpointRegistry registry) {  
    6.         //添加这个Endpoint,这样在网页中就可以通过websocket连接上服务了  
    7.         registry.addEndpoint("/coordination").withSockJS();  
    8.     }  
    9.   
    10.     @Override  
    11.     public void configureMessageBroker(MessageBrokerRegistry config) {  
    12.         System.out.println("服务器启动成功");  
    13.         //这里设置的simple broker是指可以订阅的地址,也就是服务器可以发送的地址  
    14.         /** 
    15.          * userChat 用于用户聊天 
    16.          */  
    17.         config.enableSimpleBroker("/userChat");  
    18.         config.setApplicationDestinationPrefixes("/app");  
    19.     }  
    20.   
    21.     @Override  
    22.     public void configureClientInboundChannel(ChannelRegistration channelRegistration) {  
    23.     }  
    24.   
    25.     @Override  
    26.     public void configureClientOutboundChannel(ChannelRegistration channelRegistration) {  
    27.     }  
    28. }  

    可以看到,在类中必须实现这四个方法。暂且只需要用到前两个,所以我来介绍一下,前两个方法中代码的意义。
    第一个方法,是registerStompEndpoints,大意就是注册消息连接点(我自己的理解),所以我们进行了连接点的注册:
    [java] view plain copy
     
    1. registry.addEndpoint("/coordination").withSockJS();  
    我们加了一个叫coordination的连接点,在网页上我们就可以通过这个链接来和服务器的WebSocket连接了。但是后面还有一句withSockJs,这是什么呢?SockJs是一个WebSocket的通信js库,Spring对这个js库进行了后台的自动支持,也就是说,我们如果使用SockJs,那么我们就不需要对后台进行更多的配置,只需要加上这一句就可以了。
    第二个方法,configureMessageBroker,大意是设置消息代理,也就是页面上用js来订阅的地址,也是我们服务器往WebSocket端接收js端发送消息的地址。
    [java] view plain copy
     
    1. config.enableSimpleBroker("/userChat");  
    2. config.setApplicationDestinationPrefixes("/app");  
    首先,定义了一个连接点叫userChat,从名字可以看的出,最后我会做一个聊天的例子。然后,设置了一个应用程序访问地址的前缀,目的估计是为了和其他的普通请求区分开吧。也就是说,网页上要发送消息到服务器上的地址是/app/userChat。
    说了这么多地址,估计大家都绕晕了,因为项目的整个雏形还没有出来,所以很混乱。所以接下来就配置js端。

    第三步:配置Browser端

    说了这么多地址,估计大家都绕晕了,因为项目的整个雏形还没有出来,所以很混乱。所以接下来就配置js端。
    首先我们要使用两个js库,一个是之前说过的SockJs,一个是stomp,这是一种通信协议,暂时不介绍它,只需要知道是一种更方便更安全的发送消息的库就行了。
    需要连接服务端的WebSocket:
    [javascript] view plain copy
     
    1. var socket = new SockJS('/coordination');  
    2. var stompClient = Stomp.over(socket);  
    3. stompClient.connect('', '', function (frame) {});  
    没错,就只需要两句话。有了这三句话,我们就已经可以连接上了服务器。
    使用SockJs还有一个好处,那就是对浏览器进行兼容,如果是IE11以下等对WebSocket支持不好的浏览器,SockJs会自动的将WebSocket降级到轮询(这个不知道的可以去百度一下),之前也说了,Spring对SockJs也进行了支持,也就是说,如果之前加了withSockJs那句代码,那么服务器也会自动的降级为轮询。(怎么样,是不是很兴奋,Spring这个特性太让人舒服了)
    但是连接上了服务器,却没有进行任何的操作,所以下一步,我们要在服务器端撰写响应和数据处理代码,在Browser端撰写消息发送和接收代码。当然,这是下一篇的内容了。

    结语

    这是我的毕业设计,我的毕业设计是一个在线协同备课系统,其中包含了聊天这个小功能,所以使用它来讲解一下Spring WebSocket的使用。
    我将代码放到了github上,有兴趣的朋友可以去看看代码,因为涉及到了很多协同操作,所以代码比较复杂,如果仅仅想了解Spring WebSocket的朋友,还是等我的下一篇文章吧。大笑
    github地址:https://github.com/xjyaikj/OnlinePreparation
     
    转自 http://blog.csdn.net/xjyzxx/article/details/24182677
  • 相关阅读:
    设计模式总结
    字符编码小结
    搞定java.io
    将代码托管到GitHub上
    linuxlinux 路由表设置 之 route 指令详解 路由表设置 之 route 指令详解
    linux子系统的初始化_subsys_initcall()
    Linux系统目录结构介绍
    EtherType :以太网类型字段及值
    socket编程原理
    linux下的网络接口和网络桥接
  • 原文地址:https://www.cnblogs.com/winkey4986/p/5592996.html
Copyright © 2011-2022 走看看