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

golang Gin实现websocket

golang使用 Gin实现 websocket,这里笔者重新搭建一个项目

1、创建项目安装依赖

项目名为 go-gin-websocket

在指定文件夹下,新建项目文件夹 go-gin-websocket

d90ea17676bd4ff68ddeb5ecd43845f5.png

进入项目文件夹,打开cmd窗口,在项目(go-gin-websocket)文件夹路径下,执行初始化命令 go mod init go-gin-websocket

go mod init go-gin-websocket

ef282acdb84846dbbaf3c2159feec61c.png

安装依赖

安装gin

go get -u github.com/gin-gonic/gin

 安装websocket

go get github.com/gorilla/websocket

ce9b1f9416f24320a90e01cf7ac8aef2.png

2、搭建项目

在项目目录下新建controller、static、templates、ws文件夹,分别用来存放controller代码、静态文件、页面、websocket代码

05f4bfb81ae94370aa0c7f51b6194ab1.png

在templates目录下新建 index.html页面

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
hello
<script>var webSocket;try {webSocket = new WebSocket('ws://127.0.0.1:8080/ws?id=abc123456789');}catch (e) {console.log(e)}webSocket.onerror = function(event) {}//与WebSocket建立连接webSocket.onopen = function(event) {console.log('建立连接')console.log(JSON.stringify(event))var msg = "身无彩凤双飞翼,心有灵犀一点通"//发送消息webSocket.send(msg);};//接收服务端发送的消息webSocket.onmessage=function (m) {console.log(m)console.log(m.data)}
</script>
</body>
</html>

在controller目录下新建 page_controller.go

package controllerimport "github.com/gin-gonic/gin"func Index(c *gin.Context) {c.HTML(200, "index.html", nil)
}

在ws目录下新建 websocket.go

package wsimport ("fmt""github.com/gin-gonic/gin""github.com/gorilla/websocket""log""net/http"
)func InitWebSocket(c *gin.Context) {var upgrader = websocket.Upgrader{ReadBufferSize:  1024,WriteBufferSize: 1024,CheckOrigin: func(r *http.Request) bool {log.Println("升级协议", r.Header["User-Agent"])return true},}conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)if err != nil {log.Println(err)return}defer conn.Close()userId := c.Query("id")log.Println("用户id:", userId)for {mt, message, err := conn.ReadMessage()log.Println("获取客户端发送的消息:" + string(message))fmt.Println(mt)if err != nil {log.Println(err)break}var msg = "春风得意马蹄疾,一日看尽长安花"err2 := conn.WriteMessage(websocket.TextMessage, []byte(msg))if err2 != nil {log.Println("write:", err2)break}}}

在项目根目录下新建 main.go

243f3a9eeafa4deda10a5bc7c77d3da6.png

main.go内容

package mainimport ("github.com/gin-gonic/gin""go-gin-websocket/controller""go-gin-websocket/ws"
)func main() {e := gin.Default()//html页面位置e.LoadHTMLGlob("templates/*")//静态文件位置e.Static("/static", "./static")e.GET("/", controller.Index)e.GET("/ws", ws.InitWebSocket)e.Run("0.0.0.0:8080")
}

3、运行测试

浏览器请求 http://localhost:8080/

1da3a379a25041bfb3861d916c946168.gif

4、添加session

添加session用来存储在线用户

这里使用一个map用来保存,key是用户id,value是websocket连接,再加一个读写锁保证线程安全

package wsimport ("fmt""github.com/gin-gonic/gin""github.com/gorilla/websocket""log""net/http""sync"
)var connects = make(map[string]*websocket.Conn)
var lock sync.RWMutexfunc addSession(id string, conn *websocket.Conn) {lock.Lock()connects[id] = conndefer lock.Unlock()
}
func getSession(id string) *websocket.Conn {lock.RLock()defer lock.RUnlock()return connects[id]
}
func removeSession(id string) {lock.Lock()delete(connects, id)defer lock.Unlock()
}func InitWebSocket(c *gin.Context) {var upgrader = websocket.Upgrader{ReadBufferSize:  1024,WriteBufferSize: 1024,CheckOrigin: func(r *http.Request) bool {log.Println("升级协议", r.Header["User-Agent"])return true},}conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)if err != nil {log.Println(err)return}defer conn.Close()userId := c.Query("id")log.Println("用户id:", userId)//添加sessionaddSession(userId, conn)for {mt, message, err := conn.ReadMessage()log.Println("获取客户端发送的消息:" + string(message))fmt.Println(mt)if err != nil {log.Println(err)break}var msg = "春风得意马蹄疾,一日看尽长安花"err2 := conn.WriteMessage(websocket.TextMessage, []byte(msg))if err2 != nil {log.Println("write:", err2)break}}}

至此完

相关文章:

golang Gin实现websocket

golang使用 Gin实现 websocket&#xff0c;这里笔者重新搭建一个项目 1、创建项目安装依赖 项目名为 go-gin-websocket 在指定文件夹下&#xff0c;新建项目文件夹 go-gin-websocket 进入项目文件夹&#xff0c;打开cmd窗口&#xff0c;在项目&#xff08;go-gin-websocket&a…...

冯·诺依曼体系结构与初始操作系统

目录 冯诺依曼体系结构 冯诺依曼体系结构图 内存 外存 网卡和磁盘 结构之间运算速度的差异 缓冲区 初始操作系统 概念 操作系统上边与下边分别有什么 从上到下依次顺序解析 用户 用户操作接口 系统调用接口 操作系统四项管理 驱动 硬件 冯诺依曼体系结构 冯诺…...

软件测试之黑盒测试的具体方法详解

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一.基于需求的设计方法二.等价类三.边界值四.判定表4.1 **关系**4.2 如何设计测试用例4.3 实际案例第一步第二步第三步第四步 五.正交排列5.1 什么是正交表5.2 …...

图形编辑器:历史记录设计

大家好&#xff0c;我是前端西瓜哥。今天讲一下图形编辑器如何实现历史记录&#xff0c;做到撤销重做。 其实就是版本号的更替。每个版本保存一个状态。 数据结构 要记录图形编辑器的历史记录&#xff0c;支持撤销重做功能&#xff0c;需要两个栈&#xff1a;撤销&#xff0…...

ubuntu22.04下挂载第二块硬盘

文章目录 一、查看硬盘情况二、找到nvme1n1三、挂载四、修改分区文件 一、查看硬盘情况 首先要查看一下系统识别出来的设备。也就是说&#xff0c;我希望知道&#xff0c;ubuntu到底发现了几块硬盘。用命令&#xff1a;lsblk 显示结果如下&#xff1a; 有两块硬盘&#xff1a…...

举例说明.net中in与out的作用与区别

-----作用 在 .NET 中&#xff0c;in 和 out 是用于泛型类型参数的修饰符&#xff0c;它们用于指定参数类型的协变性和逆变性。 - in 修饰符&#xff1a;表示这个泛型类型参数是协变的。也就是说&#xff0c;in 类型参数可以从较特殊的类型隐式转换为较通用的类型。例如&…...

Java常见的100道面试题(内附答案及代码示例)持续更新

什么是Java程序&#xff1f; Java程序是一组可执行的代码&#xff0c;由Java编译器编译生成&#xff0c;可以在Java虚拟机&#xff08;JVM&#xff09;上运行。 public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!&qu…...

策略设计模式知多少

目录 目标 概述 实现 目标 熟悉策略设计模式&#xff0c;了解策略设计模式的使用场景、具体实现。 概述 一、行为设计模式 行为设计模式是设计模式的一种类型。该类型的设计模式关注的重点在于对象的行为&#xff08;通信和交互&#xff09;&#xff0c;而非对象的创建方…...

第三十九章 配置镜像 - 配置 ISCAgent - 在 UNIX Linux 和 macOS 系统上为非根实例启动 ISCAgent

文章目录 第三十九章 配置镜像 - 配置 ISCAgent - 在 UNIX Linux 和 macOS 系统上为非根实例启动 ISCAgent在 UNIX/Linux 和 macOS 系统上为非根实例启动 ISCAgent在 Microsoft Windows 系统上启动 ISCAgent 自定义 ISCAgent 第三十九章 配置镜像 - 配置 ISCAgent - 在 UNIX Li…...

嵌入式安卓开发:使用Camera2获取相机

文章目录 Camera2介绍Camera2的主要API类介绍CameraManager通过CameraManage获取Cameracharacteristics通过CameraManage获取CameraDevice从CameraDevice获取CameraCaptureSession预览效果 参考 Camera2介绍 从Android 5.0开始&#xff0c;Google 引入了一套全新的相机框架 Ca…...

阿里云g8i服务器Intel Xeon(Sapphire Rapids) Platinum 8475B

阿里云服务器ECS通用型实例规格族g8i采用2.7 GHz主频的Intel Xeon(Sapphire Rapids) Platinum 8475B处理器&#xff0c;3.2 GHz睿频&#xff0c;g8i实例采用阿里云全新CIPU架构&#xff0c;可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。阿里云百科分享阿里云服…...

设计模式——组件协作模式之观察者模式

文章目录 前言一、“组件协作” 模式二、Observer 观察者模式1、动机2、模式定义3、伪代码示例①、第一种方案&#xff0c;最朴素的方式②、第二种方案&#xff0c;重构使得遵循DIP原则&#xff1a;③、进一步的小优化&#xff1a;④、修改使得支持多个观察者&#xff1a; 4、结…...

观察者设计模式知多少

目录 目标 概述 实现 推设计模式 拉设计模式 被动观察者设计模式 目标 熟悉观察者设计模式&#xff0c;了解观察者设计模式的使用场景、具体实现&#xff08;包括&#xff1a;推设计模式、拉设计模式、被动观察者设计模式&#xff09;。 概述 一、行为设计模式 行为设…...

Flink之TaskManager内存解析

一、CK失败 Flink任务的checkpoint操作失败大致分为两种情况&#xff0c;ck decline和ck expire: &#xff08;1&#xff09;ck decline 发生ck decline情况时&#xff0c;我们可以通过查看JobManager.log或TaskManager.log查明具体原因。其中有一种特殊情况为ck cancel&…...

为何越来越多人不喜欢“试用期六个月”的公司?网友:感觉不靠谱

众所周知&#xff0c;任何一份工作都有试用期&#xff0c;一般是三月左右。但如果你遇到试用期达到半年的公司&#xff0c;你会不会进入&#xff1f; 近日&#xff0c;就有人遇到了此类公司&#xff0c;并对是否要进入该公司犹豫不决。他在论坛上发帖求助&#xff1a;大家是怎…...

单例模式的四种创建方式

前言 单例模式是日常开发中最常见的一种设计模式&#xff0c;常用来做为池对象&#xff0c;或者计数器之类的需要保证全局唯一的场景。 单例模式的目的是保证在整个程序中只存在一个对象实例&#xff0c;使用单例一个前提条件就是构造器私有化&#xff0c;不允许通过new 对象…...

Nginx+Keepalived 中的脑裂现象

如何解决和预防 NginxKeepalived 中会出现的脑裂现象? Nginx是一种高性能的Web服务器和反向代理服务器&#xff0c;可以处理大量并发请求。Keepalived是一种开源软件&#xff0c;用于实现IP负载均衡和故障转移。在Nginx和Keepalived结合使用时&#xff0c;可以通过将多个Ngin…...

04 KVM虚拟化网络概述

文章目录 04 KVM虚拟化网络概述4.1 Linux Bridge4.2 Open vSwitch 04 KVM虚拟化网络概述 为了使虚拟机可以与外部进行网络通信&#xff0c;需要为虚拟机配置网络环境。KVM虚拟化支持Linux Bridge、Open vSwitch网桥等多种类型的网桥。如图1所示&#xff0c;数据传输路径为“虚…...

110页智慧农业解决方案(农业信息化解决方案)(ppt可编辑)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。 第一部分 智慧农业概述 智慧农业以农业资源为基础、市场为导向、效益为中心、产业化为抓手&#xff0c;面向农业管理部门、农技推广部门、农业企业、农业园区和基地、农业专…...

Java知识体系及聊天室程序

Java知识体系结构梳理如下&#xff1a; 基础语法&#xff1a;Java的基本语法&#xff0c;包括数据类型、运算符、控制语句、数组等。 面向对象编程&#xff1a;Java是一种面向对象的编程语言&#xff0c;需要掌握类、对象、继承、多态等概念。 异常处理&#xff1a;Java提供了…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件

在选煤厂、化工厂、钢铁厂等过程生产型企业&#xff0c;其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进&#xff0c;需提前预防假检、错检、漏检&#xff0c;推动智慧生产运维系统数据的流动和现场赋能应用。同时&#xff0c;…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Rust 异步编程

Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

Yolov8 目标检测蒸馏学习记录

yolov8系列模型蒸馏基本流程&#xff0c;代码下载&#xff1a;这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中&#xff0c;**知识蒸馏&#xff08;Knowledge Distillation&#xff09;**被广泛应用&#xff0c;作为提升模型…...

LabVIEW双光子成像系统技术

双光子成像技术的核心特性 双光子成像通过双低能量光子协同激发机制&#xff0c;展现出显著的技术优势&#xff1a; 深层组织穿透能力&#xff1a;适用于活体组织深度成像 高分辨率观测性能&#xff1a;满足微观结构的精细研究需求 低光毒性特点&#xff1a;减少对样本的损伤…...

作为测试我们应该关注redis哪些方面

1、功能测试 数据结构操作&#xff1a;验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化&#xff1a;测试aof和aof持久化机制&#xff0c;确保数据在开启后正确恢复。 事务&#xff1a;检查事务的原子性和回滚机制。 发布订阅&#xff1a;确保消息正确传递。 2、性…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...