首页 » Java » Spring » 正文

Spring Boot中使用WebSocket总结(一):几种实现方式详解

简介

所谓WebSocket, 类似于Socket,它的作用是可以让Web应用中的客户端和服务端建立全双工通信。在基于Spring的应用中使用WebSocket一般可以有以下三种方式:

  • 使用Java提供的@ServerEndpoint注解实现
  • 使用Spring提供的低层级WebSocket API实现
  • 使用STOMP消息实现

下面,我将对这三种实现方式做一个简单介绍,此外有关WebSocket性质的更多介绍可以参考以下这篇文章:WebSocket探秘

注:本篇文章的完整源码可以参考:https://github.com/zifangsky/WebSocketDemo

使用Java提供的@ServerEndpoint注解实现

(1)使用@ServerEndpoint注解监听一个WebSocket请求路径:

这里监听了客户端的连接端口/reverse,并定义了如何处理客户端发来的消息

(2)WebSocket相关配置:

(3)示例页面:

启动项目后访问页面,效果如下:

使用Spring提供的低层级WebSocket API实现

Spring 4.0为WebSocket通信提供了支持,包括:

  • 发送和接收消息的低层级API;

  • 发送和接收消息的高级API;

  • 用来发送消息的模板;

  • 支持SockJS,用来解决浏览器端、服务器以及代理不支持WebSocket的问题。

使用Spring提供的低层级API实现WebSocket,主要需要以下几个步骤:

(1)添加一个WebSocketHandler:

定义一个继承了AbstractWebSocketHandler类的消息处理类,然后自定义对”建立连接“、”接收/发送消息“、”异常情况“等情况进行处理

(2)WebSocket相关配置:

从上面代码可以看出,这里除了配置了基本的WebSocket(也就是/echoMessage这个连接地址),还使用SockJS配置了浏览器不支持WebSocket技术时的替代方案(也就是/echoMessage_SockJS这个连接地址)。

(3)两个示例页面:

i)echo.html:

ii)echo_sockjs.html:

具体效果省略,可自行运行源码查看。

使用STOMP消息实现

所谓STOMP(Simple Text Oriented Messaging Protocol),就是在WebSocket基础之上提供了一个基于帧的线路格式(frame-based wire format)层。它对发送简单文本消息定义了一套规范格式(STOMP消息基于Text,当然也支持传输二进制数据),目前很多服务端消息队列都已经支持STOMP,比如:RabbitMQ、 ActiveMQ等。

(1)WebSocket相关配置:

从上面代码可以看出,这里设置了好几个地址,简单解释如下:

  • 首先注册了一个名为/stomp-websocket的端点,也就是STOMP客户端连接的地址。

  • 此外,定义了服务端处理WebSocket消息的前缀是/message,这个地址用于客户端向服务端发送消息(比如客户端向/message/hello这个地址发送消息,那么服务端通过@MessageMapping(“/hello”)这个注解来接收并处理消息)

  • 最后,定义了一个简单消息代理,也就是服务端广播消息的路径前缀(比如客户端监听/topic/greeting这个地址,那么服务端就可以通过@SendTo(“/topic/greeting”)这个注解向客户端发送STOMP消息)。

需要注意的是,上面代码中还添加了一个名为MyChannelInterceptor的拦截器,目的是为了在客户端断开连接后打印一下日志。相关代码如下:

(2)使用@MessageMapping和@SendTo注解处理消息:

@MessageMapping注解用于监听指定路径的客户端消息,而@SendTo注解则用于将服务端的消息发送给监听了该路径的客户端。

(3)示例页面:

启动项目后访问页面,效果如下:

参考:

本文共 4 个回复

  • jht385 2019/09/01 15:26

    老哥啊,写demo不要参杂那么多无关的东西啊,什么工具类,连数据库,认证授权 都来了,完全都没用上啊。然后页面里打印用的是,console.debug 我还是这次去查的,之前都是用console.log,居然连chrome都不支持 console.debug,你用它打印干嘛啊。本来想看看demo,删得我好心累啊

    • admin 博主 2019/09/01 15:45

      @ jht385 源码中的部分代码是后面示例需要用的,所以并不是无关紧要的东西。再说了,给出示例只是用来参考的,又不是让你直接抄代码,你都在写websocket了还不会基本的增删改查吗?这就有点说不过去了吧。 最后,你觉得心累你可以关了不看,我既没有从你那儿赚一分钱,又没有逼着你看,既然觉得累又何必自讨苦吃呢!

  • 不悔 2018/12/17 14:47

    可以给个sql脚本么,老哥

    • admin 博主 2018/12/18 09:38

      @ 不悔 这几篇文章介绍的内容跟数据库没太大关系,你用你自己的SQL测试就行,或者不连数据库模拟登录吧。

发表评论

*