Go中的WebSockets:从零开始编写实时应用

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

为什么Go和WebSockets是实时的理想组合?



想象一下这样的场景:您启动一个在线聊天、股票交易终端或多人在线游戏。用户期待即时响应。没有人愿意手动刷新页面或等待5秒钟才能收到服务器的响应。这时,WebSockets就登场了。



Go(Golang)非常适合这项任务。其轻量级的goroutines(协程)允许您在不降低性能的情况下保持数万个并发连接。而标准库net/http与gorilla/websocket包相结合,使编写实时应用成为一种纯粹的乐趣。



在本文中,我们将探讨WebSocket在Go中的工作原理,编写一个简单的聊天程序,并讨论最佳实践。让我们开始吧!



什么是WebSocket,它比HTTP好在哪里?



简而言之,WebSocket是一种在客户端(浏览器)和服务器之间建立持久双向连接的协议。与传统的HTTP(客户端总是发起请求)不同,WebSocket允许服务器随时主动向客户端发送数据。



优点显而易见:

  • 即时交付 — 无需等待建立新连接。
  • 更少的流量 — 头部信息仅在握手时发送一次。
  • 高效 — 一个连接代替数千个HTTP请求。


Go擅长管理这些连接。Go不使用昂贵的操作系统线程,而是使用goroutines。一个goroutine对应一个连接。数千个goroutine在少数几个操作系统线程上运行,消耗极少的内存。



Go项目的安装和准备



假设您已经安装了Go。如果没有 — 请运行brew install go或从golang.org下载。



创建一个新模块:



mkdir go-websocket-chatcd go-websocket-chatgo mod init go-websocket-chat


现在安装最流行的库gorilla/websocket:



go get github.com/gorilla/websocket


完成。现在我们已经拥有在Go中创建实时应用所需的一切。



用Go编写WebSocket服务器



我们从最简单的开始 — 一个回声服务器。客户端发送消息,服务器将其返回。这将帮助您理解基本机制。



步骤1:连接结构体与升级



WebSocket连接始于一个HTTP请求(握手)。服务器必须将其“升级”为WebSocket。在Go中,这可以通过http.Hijacker或通过gorilla/websocket包中便捷的Upgrader方法来完成。



创建文件main.go:



package main

import ( "fmt" "log" "net/http" "github.com/gorilla/websocket")

var upgrader = websocket.Upgrader{ CheckOrigin: func(r *http.Request) bool { return true // 允许任何来源(用于开发) },}

func handleWebSocket(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Print("升级错误:", err) return } defer conn.Close()

// 无限读写循环 for { messageType, message, err := conn.ReadMessage() if err != nil { log.Println("读取错误:", err) break } log.Printf("收到: %s", message)

// 将相同的内容发送回去 err = conn.WriteMessage(messageType, message) if err != nil { log.Println("写入错误:", err) break } }}

func main() { http.HandleFunc("/ws", handleWebSocket) fmt.Println("服务器在 :8080 上启动") log.Fatal(http.ListenAndServe(":8080", nil))}


运行:go run main.go

博客

书籍推荐