Spring WebSocket教程(一)

Stella981
• 阅读 671

学习背景

很久以前就知道WebSocket,但那时不论是浏览器还是开发技术对它的支持都还很少。但是,Spring4突然发布,让我眼前一亮,Spring4直接支持WebSocket。

对于Spring我还是很喜欢的,它让Java Web开发相当的有艺术感,这次支持的WebSocket又特别的和我的胃口,所以马上就去学习了。

前提

本文的内容,是建立在懂J2EE编程,使用过Spring,听说过WebSocket上的,如果前面的3点大家不太明白,可以先去补补知识。

WebSocket还不是很普遍,对服务器和浏览器都有要求,不过使用了下面的一些技术,可以将浏览器的要求降低,但是服务器容器的要求还是比较高的,具体哪些服务器容易支持了WebSocket可以百度一下。

第一步:配置Spring

如果你跟我一样采用的Maven,那么只需要将下面的几个依赖,加入到pom.xml文件就可以了:

[html] view plain copy

  1.   

  2.     <spring.version>4.0.0.RELEASE</spring.version>  

  3.   

  4.   

  5.       

  6.       

  7.         org.springframework  

  8.         spring-core  

  9.         ${spring.version}  

  10.       

  11.       

  12.         org.springframework  

  13.         spring-web  

  14.         ${spring.version}  

  15.       

  16.       

  17.         org.springframework  

  18.         spring-webmvc  

  19.         ${spring.version}  

  20.       

  21.       

  22.       

  23.         jstl  

  24.         jstl  

  25.         1.2  

  26.       

  27.       

  28.       

  29.         org.springframework  

  30.         spring-test  

  31.         ${spring.version}  

  32.         test  

  33.       

  34.       

  35.       

  36.         org.springframework  

  37.         spring-jdbc  

  38.         ${spring.version}  

  39.       

  40.       

  41.         junit  

  42.         junit  

  43.         4.8.2  

  44.         test  

  45.       

  46.       

  47.       

  48.         org.springframework  

  49.         spring-websocket  

  50.         ${spring.version}  

  51.       

  52.       

  53.         org.springframework  

  54.         spring-messaging  

  55.         ${spring.version}  

  56.       

  57.       

  58.       

  59.         com.fasterxml.jackson.core  

  60.         jackson-databind  

  61.         2.3.0  

  62.       

  63.       

  64.         commons-fileupload  

  65.         commons-fileupload  

  66.         1.2.2  

  67.       

  68.       

  69.         commons-io  

  70.         commons-io  

  71.         2.2  

  72.       

  73.       

  74.       

  75.         com.alibaba  

  76.         druid  

  77.         1.0.4  

  78.       

  79.       

  80.       

  81.         mysql  

  82.         mysql-connector-java  

  83.         5.1.29  

  84.       

  

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.     @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,大意就是注册消息连接点(我自己的理解),所以我们进行了连接点的注册:

[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的朋友,还是等我的下一篇文章吧。Spring WebSocket教程(一)

github地址:https://github.com/xjyaikj/OnlinePreparation

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
2年前
java 实现websocket的三种方式
Java中实现websocket常见有以下三种方式:使用tomcat的websocket实现,需要tomcat7.x,JEE7的支持。使用spring的websocket,spring与websocket整合需要spring4.x,并且使用了socketjs,对不支持websocket的浏览器可以模拟websocket使用。实现WebSocke
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
4个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这