学习背景

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

前提

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

第一步:配置Spring

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

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

第二步:配置WebSocket

我采用的是使用Configurer类和 Annotation来进行WebSocket配置。
首先要创建一个类,继承WebSocketMessageBrokerConfigurer,并且在类上加上annotation:@Configuration和@EnableWebSocketMessageBroker。这样,Spring就会将这个类当做配置类,并且打开WebSocket。
  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. @Override
  10. public void configureMessageBroker(MessageBrokerRegistry config) {
  11. System.out.println("服务器启动成功");
  12. //这里设置的simple broker是指可以订阅的地址,也就是服务器可以发送的地址
  13. /**
  14. * userChat 用于用户聊天
  15. */
  16. config.enableSimpleBroker("/userChat");
  17. config.setApplicationDestinationPrefixes("/app");
  18. }
  19. @Override
  20. public void configureClientInboundChannel(ChannelRegistration channelRegistration) {
  21. }
  22. @Override
  23. public void configureClientOutboundChannel(ChannelRegistration channelRegistration) {
  24. }
  25. }

可以看到,在类中必须实现这四个方法。暂且只需要用到前两个,所以我来介绍一下,前两个方法中代码的意义。

第一个方法,是registerStompEndpoints,大意就是注册消息连接点(我自己的理解),所以我们进行了连接点的注册:
  1. registry.addEndpoint("/coordination").withSockJS();

我们加了一个叫coordination的连接点,在网页上我们就可以通过这个链接来和服务器的WebSocket连接了。但是后面还有一句withSockJs,这是什么呢?SockJs是一个WebSocket的通信js库,Spring对这个js库进行了后台的自动支持,也就是说,我们如果使用SockJs,那么我们就不需要对后台进行更多的配置,只需要加上这一句就可以了。

第二个方法,configureMessageBroker,大意是设置消息代理,也就是页面上用js来订阅的地址,也是我们服务器往WebSocket端接收js端发送消息的地址。
  1. config.enableSimpleBroker("/userChat");
  2. config.setApplicationDestinationPrefixes("/app");

首先,定义了一个连接点叫userChat,从名字可以看的出,最后我会做一个聊天的例子。然后,设置了一个应用程序访问地址的前缀,目的估计是为了和其他的普通请求区分开吧。也就是说,网页上要发送消息到服务器上的地址是/app/userChat。

说了这么多地址,估计大家都绕晕了,因为项目的整个雏形还没有出来,所以很混乱。所以接下来就配置js端。

第三步:配置Browser端

说了这么多地址,估计大家都绕晕了,因为项目的整个雏形还没有出来,所以很混乱。所以接下来就配置js端。
首先我们要使用两个js库,一个是之前说过的SockJs,一个是stomp,这是一种通信协议,暂时不介绍它,只需要知道是一种更方便更安全的发送消息的库就行了。
需要连接服务端的WebSocket:
  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

Spring WebSocket教程(一)的更多相关文章

  1. Spring WebSocket教程(二)

    实现目标 这一篇文章,就要直接实现聊天的功能,并且,在聊天功能的基础上,再实现缓存一定聊天记录的功能. 第一步:聊天实现原理 首先,需要明确我们的需求.通常,网页上的聊天,都是聊天室的形式,所以,这个 ...

  2. web即时通讯2--基于Spring websocket达到web聊天室

    如本文所用,Spring4和websocket要构建web聊天室,根据框架SpringMVC+Spring+Hibernate的Maven项目,后台使用spring websocket进行消息转发和聊 ...

  3. Spring WebSocket初探2 (Spring WebSocket入门教程)<转>

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

  4. Spring WebSocket初探1 (Spring WebSocket入门教程)<转>

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

  5. spring websocket源码分析续Handler的使用

    1. handler的定义 spring websocket支持的消息有以下几种: 对消息的处理就使用了Handler模式,抽象handler类AbstractWebSocketHandler.jav ...

  6. Spring应用教程-3 依赖关系配置

    注:组件与组件之间的耦合,采用依赖注入管理,但普通的JavaBean属性值,应直接在代码中设置. 1. 注入其他Bean的属性值 我们分析一下,Bean_A的一个属性要依赖Bean_B的一个属性值.这 ...

  7. spring WebSocket详解

    场景 websocket是Html5新增加特性之一,目的是浏览器与服务端建立全双工的通信方式,解决http请求-响应带来过多的资源消耗,同时对特殊场景应用提供了全新的实现方式,比如聊天.股票交易.游戏 ...

  8. spring+websocket整合

    java-websocket的搭建非常之容易,没用框架的童鞋可以在这里下载撸主亲自调教好的java-websocket程序: Apach Tomcat 8.0.3+MyEclipse+maven+JD ...

  9. Spring MVC 教程,快速入门,深入分析

    http://elf8848.iteye.com/blog/875830/ Spring MVC 教程,快速入门,深入分析 博客分类: SPRING Spring MVC 教程快速入门  资源下载: ...

随机推荐

  1. 跟我学SharePoint 2013视频培训课程——签出、签入文档(9)

    课程简介 第9天,怎样在SharePoint 2013中签出.签入文档 视频 SharePoint 2013 交流群 41032413

  2. Facade 设计模式

    目的 在一个子系统的一组接口上提供一个统一的接口.Facade 设计模式定义了一个更高级别的接口,使子系统更容易使用. 通过一个更加简洁的接口来包装一个复杂的子系统. 解决的问题 客户端需要一个简化的 ...

  3. Cross compiling coreutils and generate the manpages

    When we cross compiling coreutils, there is an problem of generating man pages, because the source s ...

  4. 常用的apache commons工具,直接使用,便于快速开发

    详情 :http://commons.apache.org/ Components Description Latest Version Released Attributes Runtime API ...

  5. spring-cloud/spring-cloud-sleuth github 项目 mark

    97  Star639 Fork335 spring-cloud/spring-cloud-sleuth CodeIssues 5Pull requests 1Projects 0WikiInsigh ...

  6. python标准库介绍——30 code 模块详解

    ==code 模块== ``code`` 模块提供了一些用于模拟标准交互解释器行为的函数. ``compile_command`` 与内建 ``compile`` 函数行为相似, 但它会通过测试来保证 ...

  7. .net framework多个版本在IIS服务器上时应注意-重新注册IIS-错误Server Application Unavailable

    今天客户一个附件上传的应用程序报错,服务器安装了.net 4.0 framework(还有1.0和2.0版本),因为有网站程序需要用到2.0,配置好站点后,附件程序是用的2.0,Mail程序选择版本为 ...

  8. gRPC之Node Quick Start

    在node环境下我们使用一个小例子作为引导: 在开始之前请确认如下: 1.node:版本在0.12以上 下载这个例子 为了更好地开始这个例子,你需要在本地对这个例子代码做一个备份.下载这个例子的代码从 ...

  9. svn up 排除目录更新

    svn update --set-depth=exclude tmp 则可以排除tmp目录的更新

  10. Spring MVC+Hibernate JPA搭建的博客系统项目中所遇到的坑

    标签: springmvc hibernate 2016年12月21日 21:48:035133人阅读 评论(0) 收藏 举报  分类: Spring/Spring MVC(6)  Hibernate ...