WebSocker

简介: WebSocker

WebSocket

概述

相比 HTTP 协议来说,WebSocket 协议对大多数后端开发者是比较陌生的。相比来说, WebSocket 协议重点是提供了服务端主动向客户端发送数据的能力,这样我们就可以完成实时性较高的需求。例如:聊天IM即时通讯功能,消息订阅服务、网页游戏等

这里有个误区,WebSocket相比普通的Socket来说,仅仅是借助HTTP协议完成握手,创建连接。后续所有的通讯都和HTTP协议无关。

理清 WebSocket 和 HTTP 的关系

总结:

  1. WebSocket 和 HTPP 都是基于TCP协议的两个不同的协议
  2. WebSocket 依赖于HTTP连接

WebSocket 依赖于 HTTP 连接,那么它如何从链接的 HTTP 协议转化为 WebSocket 协议?

每个 WebSocket 链接都始于 HTTP 请求。具体来说, WebSocket 协议第一次握手连接时,通过 HTTP 协议在传送 WebSocket 支持的版本号、协议的子版本号、原始地址、主机地址等等一系列字段给服务端:

GET /chat HTTP/1.1
Host: server.example.com
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==
Origin: http://example.com
Sec-WebSocket-Version: 13

注意:关键的地方是,这里面有个Upgrade首部,用来把当前的HTTP请求升级到 WebSocket 协议,这是 HTTP 协议本身的内容,是为了扩展其他的通讯协议。如果服务器支持新的协议,则必须返回 101

HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=

至此,HTTP请求物尽其用,如果成功出发onopen事件,否则触发onerror事件,后面的传输则不再依赖HTTP协议。

WebSocket 为什么要依赖 HTTP 协议的连接 ?

  • WebSocket 设计上就是天生为 HTTP 增强通讯,所以在 HTTP 协议链接的基础上是自然的一件事,并因此能获得 HTTP 的诸多便利。
  • 诸多便利中有一条很重要,基于 HTTP 连接将获取最大的一个兼容支持,比如即使服务器不支持 WebSocket 也能建立 HTTP 通信,只不过返回的是 onerror 而已,这显然比服务器无响应要好得多。

在实现提供 WebSocket 服务的项目中,一般有如下几种解决方案:

如果仅仅是仅仅提供 WebSocket 协议的支持,可以考虑采用方案一或者方案二。在使用上,两个方案是比较接近的。相比来说,方案一 Spring WebSocket 内置了对 STOMP 协议的支持。

WebSocket Demo

C:\Users\Administrator\Desktop\mall\spring-websocket-demo
C:\Users\Administrator\Desktop\mall\Tomcat-websocket-demo
http://www.iocoder.cn/Spring-Boot/WebSocket/

如何保证消息一定送达给用户呢?

如果用户不在线的时候,消息持久化到MySQL、MongoDB、Redis等等数据库中,这个是必要的。

我们在考虑下边界情况,客户端网络环境差,特别是在移动端场景下,出现网络闪断,可能会出现连接实际断开,而服务器以为客户端处于在线情况。吃屎,服务端会将消息发送给客户端,那么消息实际就会发送到 “空气”中,产生丢失情况,要解决这种情况的问题,需要引入客户端的 ACK 消息机制。目前主流的做法有两种方法。

第一种基于每一条消息编号 ACK 整体流程如下:

  • 无论客户端是否在线,服务端都先把接收到的消息持久化到数据库中。如果客户端在线,服务端将完整的消息推送给客户端
  • 客户端接收到消息后,发送 ACK 消息编号给服务端,告知已收到该消息。服务端在收到 ACK 消息编号的时,标记该消息已经发送成功。
  • 服务端定时轮询,在线的客户端,是否有超过N秒未 ACK 的消息,如果有,则重新发送消息给客户端。

不过因为服务端仍然需要定时轮询,也会导致服务端压力较大。所以,这种方案基本已经不采用了。

第二种,基于滑动窗口 ACK,整体流程如下:

  • 无论客户端是否在线,服务端都先把接收到的消息持久化到数据库中。 如果客户端此时在线,服务端将消息编号推送给客户端。
  • 客户端在接收到消息编号之后,和本地的消息编号进行对比。如果比本地的小,说明该消息一经收到,忽略不计;如果比本地大,使用本地的消息编号,向服务端拉取大于本地的消息编号的消息列表,增量消息列表。拉去完之后,更新消息列表中最大的消息编号为新的本地的消息编号
  • 服务端在收到客户端拉取增量的消息列表时,将请求的编号记录到数据库中,用于知道客户端此时本地的最新消息编号。
  • 考虑到服务端将消息编号推送给客户端,也会存在丢失的情况,所以客户端会每 N 秒定时向服务端拉取大于本地的消息编号的消息列表。

这种方式,在业务被称为推拉结合的方案,在分布式消息队列、配置中心、注册中心实现实时的数据同步,经常被采用。

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
机器学习/深度学习 人工智能 编解码
阿里 DSW 试用心得——用 PAI-DSW 修复老照片
通过试用阿里 DSW 了解了命令行和 SD WebUI 两种方式进行老照片修复的相关知识
1206 1
阿里 DSW 试用心得——用 PAI-DSW 修复老照片
|
9月前
|
消息中间件 JSON 数据库
探索Flink动态CEP:杭州银行的实战案例
本文由杭州银行大数据工程师唐占峰、欧阳武林撰写,介绍Flink动态CEP的定义、应用场景、技术实现及使用方式。Flink动态CEP是基于Flink的复杂事件处理库,支持在不重启服务的情况下动态更新规则,适应快速变化的业务需求。文章详细阐述了其在反洗钱、反欺诈和实时营销等金融领域的应用,并展示了某金融机构的实际应用案例。通过动态CEP,用户可以实时调整规则,提高系统的灵活性和响应速度,降低维护成本。文中还提供了具体的代码示例和技术细节,帮助读者理解和使用Flink动态CEP。
1079 2
探索Flink动态CEP:杭州银行的实战案例
|
开发框架 前端开发 JavaScript
基于SqlSugar的开发框架循序渐进介绍(2)-- 基于中间表的查询处理
基于SqlSugar的开发框架循序渐进介绍(2)-- 基于中间表的查询处理
|
移动开发 前端开发 安全
React Native环境搭建及配置问题
React Native环境搭建及配置问题
289 2
|
11月前
|
人工智能 监控 数据可视化
CAP项目体验评测
CAP项目体验评测:从快速部署到空白项目创建,CAP展现了强大的自动化能力和稳定的性能表现。通过RAG模板部署,轻松实现高并发下的稳定运行,且支持二次开发。然而,在权限管理和数据可视化方面仍有改进空间,建议增加更多行业模板及增强与第三方服务的集成,以满足更广泛的需求。
162 4
|
存储 缓存 算法
【Conan 入门教程 】了解 Conan2.1 中默认生成器的作用
【Conan 入门教程 】了解 Conan2.1 中默认生成器的作用
285 1
|
机器学习/深度学习 搜索推荐 PyTorch
【机器学习】图神经网络:深度解析图神经网络的基本构成和原理以及关键技术
【机器学习】图神经网络:深度解析图神经网络的基本构成和原理以及关键技术
2881 3
|
存储 Linux PHP
云环境下使用NAS搭建个人网盘
根据云起实验室提供的环境。记录一下在云环境下使用NAS搭建个人网盘,安装及初始配置。
1407 1
|
开发者
vue3中父组件与子组件的区别和传参的方法
vue3中父组件与子组件的区别和传参的方法
|
存储 XML JSON
c语言使用protobuf与后台前置通信优点及使用总结
c语言使用protobuf与后台前置通信优点及使用总结