博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WebSocket 实现前后端通信的笔记
阅读量:6226 次
发布时间:2019-06-21

本文共 3846 字,大约阅读时间需要 12 分钟。

之前在做站内信时,用到了 WebSocket ,整理了一些笔记分享如下。

本文基于 SpringBoot 2.1.5,本文不涉及环境搭建。

引入依赖

在 Spring 中要使用 WebSocket 功能,需要在pom中引入依赖:

    
org.springframework.boot
    
spring-boot-starter-websocket

配置类

增加一个配置类,用于定义 WebSocket 全局配置信息

@Configuration @EnableWebSocketMessageBroker public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer {
    /**      * 注册stomp端点      * @param registry      */     @Override     public void registerStompEndpoints(StompEndpointRegistry registry) {
        ## 允许使用socketJs方式访问 即可通过http://IP:PORT/xboot/ws来和服务端websocket连接         registry.addEndpoint("/tmax/ws").setAllowedOrigins("*").withSockJS();     }     /**      * 配置信息代理      * @param registry      */     @Override     public void configureMessageBroker(MessageBrokerRegistry registry) {
        ## 订阅Broker名称 user点对点 topic广播即群发         registry.enableSimpleBroker("/user","/topic");         ## 全局(客户端)使用的消息前缀         registry.setApplicationDestinationPrefixes("/app");         ## 点对点使用的前缀 无需配置 默认/user         registry.setUserDestinationPrefix("/user");     } }

来看一下这两个方法:

1、registerStompEndpoints(StompEndpointRegistry registry)

注册stomp端点。起到的作用就是添加一个服务端点,来接收客户端的连接,

registry.addEndpoint("/tmax/ws") 表示添加了一个 /tmax/ws 端点,客户端可以通过这个端点来进行连接。withSockJS() 的作用是开启 SockJS 访问支持,即可通过http://IP:PORT/tmax/ws 来和服务端 websocket 连接。

2、configureMessageBroker(MessageBrokerRegistry registry)

配置信息代理。定义消息代理,设置消息连接请求的各种规范信息。

registry.enableSimpleBroker("/user","/topic") 表示客户端订阅地址的前缀信息,也就是客户端接收服务端消息的地址的前缀信息(比较绕,看完整个例子,大概就能明白了)registry.setApplicationDestinationPrefixes("/app") 指服务端接收地址的前缀,意思就是说客户端给服务端发消息的地址的前缀。
registry.setUserDestinationPrefix("/user") 指推送用户前缀。

我不不难发现,setApplicationDestinationPrefixessetUserDestinationPrefix 起到的效果敲好相反,一个定义了客户端接收的地址前缀,一个定义了客户端发送地址的前缀。

开始业务代码的编写

先了解几个知识点,下方会用到。

1、MessageMapping

接收客户端请求连接注解。Spring 对于 WebSocket 封装的特别简单,提供了一个 @MessageMapping 注解,功能类似 @RequestMapping,它是存在于Controller中的,定义一个消息的基本请求,功能也跟 @RequestMapping类似,包括支持通配符 的url定义等等。

2、SimpMessagingTemplate

SimpMessagingTemplate 是 Spring-WebSocket 内置的一个消息发送工具,可以将消息发送到指定的客户端。

3、SendTo

@SendTo 可以把消息广播到路径上去,例如下面可以把消息广播到 "/topic/greetings”,如果客户端在这个路径订阅消息,则可以接收到消息

接下来看一下后台代码实现,HelloController

/**  * @author niceyoo  */ @Slf4j @Controller @Api(description = "hello接口") @Transactional public class HelloController {
    @Autowired     private SimpMessagingTemplate messagingTemplate;     /**      * 跳转至hello.html界面      * @return      */     @RequestMapping("/hello")     public String hello(){
        return "hello";     }     /**      * 接收然后转发至客户端消息      * @param message      * @return      * @throws Exception      */     @MessageMapping("/top")     @SendTo("/topic/greetings")     public String greeting(String message) throws Exception {
        System.out.println("receiving " + message);         System.out.println("connecting successfully.");         return "AAA:"+message;     }     /**      * 推送消息      * @return      */     @ResponseBody     @RequestMapping("/hello/addMessage")     public Result addMessage(){
        messagingTemplate.convertAndSend("/topic/greetings", "您收到了新的系统消息");         return new ResultUtil().setSuccessMsg("添加成功");     } }

hello.html 代码:

       
    
    
    

Index

    
    
    
登陆客户端     
发送消息

操作流程:

点击“登录客户端”,输入框内输入内容,点击发送消息。

消息推送

关于消息的推送,借助 postman,调用 http://127.0.0.1:8888/hello/addMessage,实现后端推送至客户端。

额外补充,关于消息推送,往往会用到推送至指定用户,则:messagingTemplate.convertAndSendToUser(id,"/queue/subscribe", "您收到了新的消息"); ,其中id为系统用户id。

详细可搜索 SimpMessagingTemplate 的一些用法。

如果文章有错的地方欢迎指正,大家互相留言交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:niceyoo

参考地址:https://www.jianshu.com/p/60799f1356c5

转载于:https://www.cnblogs.com/niceyoo/p/10913564.html

你可能感兴趣的文章
ASP.NET上传控件
查看>>
用Visual Studio 2008进行Silverlight开发的准备工作
查看>>
校园-秋
查看>>
document.getElementsByName 在IE与firefox表现不一,解决办法
查看>>
IXWebHosting的URL转向设置
查看>>
octopress的一些总结
查看>>
Linux- systemd
查看>>
TCP编程的迷惑
查看>>
【转】这个“哭喊着要进步”的电子工程师一路怎么走过来的~
查看>>
使用Lambda实现递归
查看>>
opengl overlay plane
查看>>
静态库和动态库
查看>>
近来有不少博友向本人提向,鉴于本站的邮件系统不是很好用,建议大家加入本人的QQ群...
查看>>
[转] SQL Server 批量 停用/启用 外键约束
查看>>
Bug管理工具
查看>>
Django performance
查看>>
touch — 设定文件的访问和修改时间
查看>>
Spark集群模式&Spark程序提交
查看>>
package-info.java(转载)
查看>>
Hash
查看>>