当前位置: 首页 > article >正文

Go websocket

Go 中的 gorilla/websocket 是一个常用且高效的 WebSocket 实现库,可以帮助你轻松地在 Web 应用中实现实时通信。学习 gorilla/websocket 的基本用法包括建立 WebSocket 连接、发送和接收消息、处理错误、以及在实际场景中的使用。以下是关于 gorilla/websocket 的学习步骤和一些使用示例。

1. 安装 gorilla/websocket

首先,你需要安装 gorilla/websocket 包,可以使用以下命令进行安装:

go get github.com/gorilla/websocket

2. 基本使用步骤

2.1 建立 WebSocket 服务器

在服务器端,你需要升级 HTTP 连接到 WebSocket,并处理来自客户端的消息。以下是一个简单的 WebSocket 服务器示例:

package main

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

var upgrader = websocket.Upgrader{
	// CheckOrigin 函数用于控制 WebSocket 的跨域请求
	CheckOrigin: func(r *http.Request) bool {
		return true
	},
}

func handleWebSocket(w http.ResponseWriter, r *http.Request) {
	// 将 HTTP 连接升级到 WebSocket
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Println("Upgrade error:", err)
		return
	}
	defer conn.Close()

	for {
		// 读取消息
		messageType, message, err := conn.ReadMessage()
		if err != nil {
			log.Println("Read error:", err)
			break
		}

		log.Printf("Received: %s", message)

		// 将消息返回给客户端
		err = conn.WriteMessage(messageType, message)
		if err != nil {
			log.Println("Write error:", err)
			break
		}
	}
}

func main() {
	http.HandleFunc("/ws", handleWebSocket)
	log.Println("Server started on :8080")
	err := http.ListenAndServe(":8080", nil)
	if err != nil {
		log.Fatal("ListenAndServe error:", err)
	}
}

2.2 创建 WebSocket 客户端

客户端可以使用 JavaScript 来连接和与 WebSocket 服务器通信。以下是一个简单的 HTML 客户端示例:

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Test</title>
</head>
<body>
    <script>
        const ws = new WebSocket('ws://localhost:8080/ws');

        ws.onopen = function() {
            console.log('Connected to server');
            ws.send('Hello Server');
        };

        ws.onmessage = function(event) {
            console.log('Received from server:', event.data);
        };

        ws.onclose = function() {
            console.log('Connection closed');
        };
    </script>
</body>
</html>

3. 高级用法

3.1 处理 JSON 消息

如果你需要处理 JSON 格式的消息,可以使用 encoding/json 包对消息进行编码和解码:

import (
	"encoding/json"
)

// 示例结构体
type Message struct {
	Type string `json:"type"`
	Data string `json:"data"`
}

// 读取 JSON 消息
var msg Message
err := conn.ReadJSON(&msg)
if err != nil {
	log.Println("ReadJSON error:", err)
}

// 发送 JSON 消息
err = conn.WriteJSON(Message{Type: "response", Data: "Hello, Client"})
if err != nil {
	log.Println("WriteJSON error:", err)
}
3.2 广播消息

在 WebSocket 服务器中,可能需要将消息广播给所有连接的客户端,可以使用一个中央的管理器来跟踪所有的连接:

type Hub struct {
	connections map[*websocket.Conn]bool
	broadcast   chan []byte
}

var hub = Hub{
	connections: make(map[*websocket.Conn]bool),
	broadcast:   make(chan []byte),
}

func (h *Hub) run() {
	for {
		message := <-h.broadcast
		for conn := range h.connections {
			if err := conn.WriteMessage(websocket.TextMessage, message); err != nil {
				conn.Close()
				delete(h.connections, conn)
			}
		}
	}
}

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

	hub.connections[conn] = true

	for {
		_, message, err := conn.ReadMessage()
		if err != nil {
			log.Println("Read error:", err)
			break
		}
		hub.broadcast <- message
	}
}

func main() {
	go hub.run()
	http.HandleFunc("/ws", handleWebSocket)
	log.Fatal(http.ListenAndServe(":8080", nil))
}

4. 常见使用场景

  • 实时聊天应用: 使用 WebSocket 可以实现实时聊天功能,支持双向通信。
  • 实时通知系统: 用于推送实时的事件通知,如股票价格更新、社交媒体提醒等。
  • 多人在线游戏: 实现实时互动的多人在线游戏,确保玩家之间的同步。
  • 协同编辑工具: 用于构建实时协作的编辑器,如多人同时编辑文档或白板。

通过学习和使用 gorilla/websocket,你可以在 Go 应用中轻松实现实时通信,满足各种实时数据传输的需求。


http://www.kler.cn/news/304483.html

相关文章:

  • Python基础学习(1)
  • overleaf如何下载论文的pdf
  • 使用PyTorch进行图像风格迁移:基于VGG19实现
  • Git工作流程
  • Nacos 与 Eureka 的区别
  • vue3 使用 codemirror 实现yaml文件的在线编辑
  • 点餐|基于java的电子点餐系统小程序(源码+数据库+文档)
  • 【Excel 表打印基本操作】
  • 【图像识别】摄像头捕捉运动到静止视频帧(免费源码分享)
  • Maven从入门到精通(三)
  • IVF 视频文件格式
  • [网络][CISCO]CISCO_华为网络设备端口镜像配置
  • Cache Aside pattern
  • EG边缘计算网关连接纵横云3.0物联网平台(MQTT协议)
  • Notepad++插件:TextFX 去除重复行
  • 快速理解Redis
  • 【系统规划与管理师】【案例分析】【考点】【问题篇】第5章 IT服务部署实施
  • MiniCPM-V: A GPT-4V Level MLLM on Your Phone
  • Ansys HFSS的边界条件与激励端口
  • 【Linux入门】iptables的安装与配置应用实例
  • pg \d 在不同模式下有同名表时注意事项
  • 828华为云征文|华为云Flexus X实例docker部署Jitsi构建属于自己的音视频会议系统
  • 软件工程毕业设计开题汇总
  • 如何在 DigitalOcean Droplet 云服务器上部署 Next.js 应用
  • 技术周刊 | Vue3.5、Replit Agent、Cursor 使用技巧、React 19 中的新功能、8 月 Web 平台的新功能
  • 9.11 QT ( Day 4)
  • oracle数据库安装和配置详细讲解
  • 个人学习笔记6-2:动手学深度学习pytorch版-李沐
  • Qt使用UDP进行单波通信
  • 实习项目|苍穹外卖|day9