Go上的WebSocket:使用Golang构建实时应用

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

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

开始课程

Go语言中的WebSocket:使用Golang构建实时应用程序



现代Web应用程序越来越需要客户端和服务器之间的即时数据传输。传统的HTTP请求-响应模式不适合聊天、在线游戏、交易平台和实时监控。WebSocket协议应运而生,它建立了持久的双向连接。在本文中,我们将探讨如何使用Go(Golang)和WebSocket构建实时应用程序。



Go语言凭借其内置的并发支持(goroutine和通道)以及高性能,非常适合此项任务。我们将一起编写一个简单的WebSocket服务器,实现聊天功能,并探讨典型问题。



什么是WebSocket,为什么在Go中需要它?



WebSocket是一种基于TCP工作的协议。它以HTTP请求(握手)启动,之后连接"升级"为持久的双向通道。与长轮询或服务器发送事件不同,WebSocket允许服务器和客户端随时发送数据,无需重新建立连接。



在Go中使用WebSocket的优势:



  • 并发性:goroutine可以轻松处理数千个并发连接。
  • 性能:每个连接的内存消耗极小。
  • 简洁性:标准库net/http和gorilla/websocket包使代码简洁明了。


WebSocket常用于:

  • 聊天系统和即时通讯工具
  • 在线编辑器(如Google Docs)
  • 交易终端(股票行情)
  • 游戏和模拟器


在Go中安装和配置WebSocket



Go的标准库中没有内置WebSocket支持,但有一个优秀的gorilla/websocket包。我们来安装它:



go get github.com/gorilla/websocket


让我们创建一个最小化的HTTP服务器,用于处理WebSocket连接。首先,编写一个处理函数,将HTTP请求"升级"为WebSocket。



package main

import ( "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)

// 回声响应:将同一条消息发送回去 if err := conn.WriteMessage(messageType, message); err != nil { log.Println("写入错误:", err) break } }}

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


这段代码创建了一个简单的回声服务器。客户端连接到ws://localhost:8080/ws,会收到所有发送出去的消息的返回。



在Go中使用WebSocket创建实时聊天



现在我们来扩展功能:创建一个所有连接的客户端都能看到彼此消息的聊天室。为此,我们需要管理连接列表并广播消息。



主要组件:

  • Hub — 中央管理器,负责注册/移除客户端以及广播消息。
  • Client — 表示单个WebSocket连接。

博客

书籍推荐