websocket js 判断send 失败_WebSocket 在 SpringBoot 中的实践

传统的服务端-客户端通信协议为HTTP,其只能先由客户端发起请求,且为短连接。所以,服务端无法按需向客户端推送数据,只能让客户端依靠轮询的方式来请求新数据。而在HTML 5标准中的WebSocket技术则恰好可以解决这个问题,其由客户端发起连接为长连接,服务端和客户端可以一直保存这个长连接。本文简要介绍在SpringBoot下的WebSocket实践

9afe5a4eac836b97ac4db0f547b09770.png

实践入门

在pom.xml中添加WebSocket依赖

org.springframework.boot

spring-boot-starter-websocket

2.1.4.RELEASE

根据Spring官方的文档,编写一个Java Bean的配置类来创建WebSocket的Handler Bean,其需继承 WebSocketConfigurer 类,并通过重写 registerWebSocketHandlers 方法实现将WebSocket 的 Handler 和 Websocket的请求路径进行绑定

@Configuration

@EnableWebSocket

public class WebSocketConfig implements WebSocketConfigurer {

@Override

public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) {

webSocketHandlerRegistry.addHandler(webSocketHandler(),"/testHandler").setAllowedOrigins("*");

// 不使用 setAllowedOrigins 方法,服务端将不会接收跨域请求,后文将详述

//webSocketHandlerRegistry.addHandler(webSocketHandler(),"/testHandler");

}

@Bean

public TextWebSocketHandler webSocketHandler() {

return new Handler1();

}

}

Note:

  • 在该类上添加 @EnableWebSocket 注解,否则无法启用WebSocket

根据Spring官方的文档,按照上面的配置写一个用于处理WebSocket的Handler1类即可,其可继承TextWebSocketHandler类,该类提供了WebSocket中一些基本的操作方法,我们只需按需重写相关方法即可,实现对WebSocket的连接管理和消息处理功能,示例代码如下所示:

@Component

public class Handler1 extends TextWebSocketHandler {

// js 调用 websocket.onopen时 ,服务端即会调用该方法,建立连接

@Override

public void afterConnectionEstablished(WebSocketSession session) throws Exception {

super.afterConnectionEstablished(session);

System.out.println("服务器建立连接 .........");

}

// js 调用 websocket.send 发送消息时,服务端即会调用该方法,处理客户端的消息

@Override

protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {

super.handleTextMessage(session, message);

System.out.println("服务器收到消息:" + message.getPayload());

// 发送消息给客户端

session.sendMessage(new TextMessage("Hello World"));

}

// js 调用 websocket.close时, 服务端即会调用该方法,关闭当前客户端的连接

@Override

public void afterConnectionClosed(WebSocketSession session, CloseStatus status) throws Exception {

System.out.println("服务器关闭连接");

}

}

测试结果如下:

c986c32bda3de6152bbd305404a7bc72.png

Status Code: 403 跨域请求失败

当浏览器地址栏的url 和 WebSocket url不一致时,如下图所示。地址栏的url为localhost而WebSocket的url为127.0.0.1时,如果我们不使用setAllowedOrigins() 方法,会发现WebSocket请求失败,其状态码为403,从Server的日志中我们也可以看出,由于跨域问题,服务端拒绝客户端的请求。所以,只需按前文所述,调用 setAllowedOrigins("*") 即可让服务端响应跨域请求

ce424290d7bce6d62444bbaa97e4ee18.png

93b873dbde5f136d391dd5f6d714e1b2.png

参考

Spring WebSocket 官方文档 (https://docs.spring.io/spring/docs/5.0.8.RELEASE/spring-framework-reference/web.html#websocket)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了小程序应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值