WebSocket 基础
实时双向通信
WebSocket 基础 是 CoddyKit 上的免费 Go Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Go Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Go Academy 课程共包含 4 节课。
实时双向通信
HTTP 采用请求-响应模式:客户端发出请求,服务器返回响应,连接在逻辑上随即结束。聊天、实时仪表板和游戏需要持久的双向通道,这正是 WebSockets 所提供的功能。
升级握手
WebSocket 连接会以普通 HTTP 请求开始,并带有特殊标头:
Upgrade: websocketConnection: Upgrade
服务器会响应 101 Switching Protocols,然后重新使用 TCP 套接字传输全双工帧。
为什么不直接轮询
在 WebSockets 出现之前,应用会使用轮询(重复请求)或长轮询。两者都会浪费带宽并增加延迟。WebSockets 会保持一个开放连接,因此任意一方都可以立即发送数据。
帧,而不是请求
升级完成后,数据会以轻量级帧的形式传输,而不是 HTTP 消息。帧可以是文本或二进制数据,还存在用于 ping/pong 和关闭连接的控制帧。
全双工
与 HTTP 不同,两个对等方都可以随时发送数据,无需等待回复。服务器可以在状态发生变化的瞬间推送通知,客户端也可以同时发送输入。
ws 与 wss
与 http/https 类似,WebSockets 有两种协议方案:
ws://明文传输wss://通过 TLS 传输(生产环境请使用此方案)
标准库支持
仅使用 net/http 时,Go 的标准库没有 WebSocket 实现。社区通常使用 github.com/gorilla/websocket 或 nhooyr.io/websocket。下一课将介绍 gorilla。
import "github.com/gorilla/websocket"一种心智模型
请把 WebSocket 想象成一次电话通话:
- 拨号 = HTTP 升级握手
- 保持接通 = 持久连接
- 双方交谈 = 全双工帧
- 挂断 = 关闭帧
消息类型
最重要的两种数据帧类型是:
- 文本帧承载 UTF-8(通常是 JSON)
- 二进制帧承载原始字节(protobuf、图像)
控制帧(ping、pong、close)负责管理连接本身。
WebSocket 的优势场景
非常适合以下场景:
- 聊天和在线状态
- 实时交易或体育比分
- 协作编辑
- 多人游戏状态
如果只需要从服务器单向发送到客户端,服务器发送事件可能更简单。
可运行示例:理解帧的概念
WebSocket 代码需要外部库,因此这里使用标准库进行类比:通过一个函数将消息分类为文本或二进制,以说明帧类型。
package main
import (
"fmt"
"unicode/utf8"
)
func frameType(data []byte) string {
if utf8.Valid(data) {
return "text"
}
return "binary"
}
func main() {
fmt.Println(frameType([]byte("hello")))
fmt.Println(frameType([]byte{0xff, 0x00, 0x01}))
}快速检查
请测试您对 WebSocket 基础知识的理解。
回顾
您学习了 WebSocket 的基础知识:
- 它提供持久的全双工通信
- 它以 HTTP 升级握手开始(101 响应)
- 数据以文本帧或二进制帧流动;控制帧负责管理连接
- 在生产环境中使用
wss://;Go 依赖 gorilla/websocket 之类的库
常见问题解答
「WebSocket 基础」课时是免费的吗?
是的 — 「WebSocket 基础」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Go Academy 课程的其余内容,请升级到 CoddyKit PRO。 Go Academy 课程共包含 4 节课。
「WebSocket 基础」这节课中我会学到什么?
实时双向通信 你通过在浏览器中直接运行的动手代码来练习 Go Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 Go Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 Go Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「WebSocket 基础」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 Go Academy 课中编写并运行代码吗?
能。每节 Go Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- WebSocket 基础
- 使用 gorilla/websocket
- 广播消息
- 连接管理