WebSocket

一、什么是WebSocket WebSocket 是一种在单个TCP连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。 在 WebSocket API 中,浏览器和服务器只需要完成一次握手,两者之间就直接可以创建持久性的连接, 并进行双向数据传输。(维基百科) WebSocket本质上一种计算机网络应用层的协议,用来弥补http协议在持久通信能力上的不足。 WebSocket 协议在2008年诞生,2011年成为国际标准。现在最新版本浏览器都已经支持了。 它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。 WebSocket 的其他特点包括: (1)建立在 TCP 协议之上,服务器端的实现比较容易。 (2)与 HTTP 协议有着良好的兼容性。默认端口也是80和443,并且握手阶段采用 HTTP 协议,因此握手时不容易屏蔽,能通过各种 HTTP 代理服务器。 (3)数据格式比较轻量,性能开销小,通信高效。 (4)可以发送文本,也可以发送二进制数据。 (5)没有同源限制,客户端可以与任意服务器通信。 (6)协议标识符是ws(如果加密,则为wss),服务器网址就是 URL。 ws://example.com:80/some/path 为什么需要 WebSocket? 我们已经有了 HTTP 协议,为什么还需要另一个协议?它能带来什么好处? 因为 HTTP 协议有一个缺陷:通信只能由客户端发起,不具备服务器推送能力。 举例来说,我们想了解查询今天的实时数据,只能是客户端向服务器发出请求,服务器返回查询结果。HTTP 协议做不到服务器主动向客户端推送信息。 这种单向请求的特点,注定了如果服务器有连续的状态变化,客户端要获知就非常麻烦。我们只能使用“轮询”:每隔一段时候,就发出一个询问,了解服务器有没有新的信息。最典型的场景就是聊天室。轮询的效率低,非常浪费资源(因为必须不停连接,或者 HTTP 连接始终打开)。 在 WebSocket 协议出现以前,创建一个和服务端进双通道通信的 web 应用,需要依赖HTTP协议,进行不停的轮询,这会导致一些问题: 服务端被迫维持来自每个客户端的大量不同的连接 大量的轮询请求会造成高开销,比如会带上多余的header,造成了无用的数据传输。 http协议本身是没有持久通信能力的,但是我们在实际的应用中,是很需要这种能力的,所以,为了解决这些问题,WebSocket协议由此而生,于2011年被IETF定为标准RFC6455,并被RFC7936所补充规范。 并且在HTML5标准中增加了有关WebSocket协议的相关api,所以只要实现了HTML5标准的客户端,就可以与支持WebSocket协议的服务器进行全双工的持久通信了。 WebSocket 与 HTTP 的区别 WebSocket 与 HTTP的关系图: 相同点: 都是一样基于TCP的,都是可靠性传输协议。都是应用层协议。 联系: WebSocket在建立握手时,数据是通过HTTP传输的。但是建立之后,在真正传输时候是不需要HTTP协议的。 下面一张图说明了 HTTP 与 WebSocket 的主要区别: ...

November 8, 2024

AIRead 实战拆解:KMM 语音播报 SDK 从 start 到双端播放链路

阅读导航(建议先看) 如果你是第一次接触这套 SDK,建议按下面顺序读: 先看 2 章:理解 commonMain 与双端 actual 的职责边界; 再看 5~6 章:把“主流程 + 双端播放器实现”串起来; 最后看 10 章:按需查 Debug 手册,不必一次读完。 如果你只想快速建立整体认知,优先看 0 + 5 + 9 + 12 四节即可。 0. 这篇写什么 这篇不再重复 KMM 概念,而是聚焦一件事:AIRead 这套 KMM SDK 在工程上到底怎么跑起来。 会重点回答四个问题: 工程目录怎么分层; 核心 API 给了什么能力; 从 start(contentId, sentenceId) 到播放/高亮/回调/重连,链路如何闭环; Android(ExoPlayer)和 iOS(AVPlayer)分别承担了什么。 KMM 基础与平台适配背景放在上一篇:KMM 基础篇。 1. 仓库目录总览 AIRead 仓库根目录: AIRead/ ├── androidApp/ # Android 示例应用(Compose + WebView) ├── iosApp/ # iOS 示例应用(SwiftUI + WKWebView) ├── shared/ # KMM SDK 主模块 ├── gradle/ # 版本目录、发布脚本、wrapper ├── build.gradle.kts ├── settings.gradle.kts ├── gradle.properties └── README.md 先按根目录分工看一眼: ...

June 2, 2026