首页 > 其他分享 >go+gin webscoket 怎么实现心跳

go+gin webscoket 怎么实现心跳

时间:2024-03-21 17:23:50浏览次数:17  
标签:WebSocket err 心跳 go gin websocket webscoket 客户端

在Go+Gin中实现WebSocket的心跳,你需要一个WebSocket库,如gorilla/websocket。下面的例子展示了如何实现心跳机制:

package main

import (
    "net/http"
    "time"

    "github.com/gin-gonic/gin"
    "github.com/gorilla/websocket"   
)

// 升级器,用于将HTTP连接升级为WebSocket连接
var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func websocketEndpoint(c *gin.Context) {
    // 升级HTTP连接为WebSocket
    conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
    if err != nil {
        http.Error(c.Writer, "Could not open websocket connection", http.StatusBadRequest)
    }

    go func() {
        // 每30秒发送一个ping消息到客户端来检测连接是否正常
        for {
            err := conn.WriteMessage(websocket.PingMessage, []byte{})
            if err != nil {
                return
            }

            time.Sleep(30 * time.Second)
        }
    }()

    for {
        // 处理来自客户端的消息
        _, _, err := conn.ReadMessage()
        if err != nil {
            conn.Close()
            break
        }
        // ...
    }
}

func main() {
    router := gin.Default()

    router.GET("/ws", websocketEndpoint)

    router.Run(":8080")
}

以上代码实现了一个简单的WebSocket服务端,客户端需要通过/ws路径来连接此WebSocket服务。
这个服务器会不间断地每30秒发送一次ping消息到每个连接的客户端,作为心跳。如果写入消息(发送心跳)失败,那么就终止这个心跳发送协程,因为这可能意味着客户端已经断开连接。
并且这个服务器也会不停地去读取来自客户端的信息,如果读取失败,那么会关闭连接,这也可能是因为客户端已经断开连接。
不过注意,这个例子假设客户端会对心跳ping进行正确的回应(发送一个pong回来)。如果客户端不这么做的话,可能需要另外的机制来检测连接是否终止。

标签:WebSocket,err,心跳,go,gin,websocket,webscoket,客户端
From: https://www.cnblogs.com/0x1cc4/p/18087819

相关文章

  • Go操作Kafka
    目录一、Go操作之kafka二、sarama1.下载及安装2.注意事项三、连接使用kafka1.发送消息2.消费消息一、Go操作之kafkaKafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据,具有高性能、持久化、多副本备份、横向扩展等特点。本文介绍了......
  • Go+Gin 接口防止用户频繁访问
    在Go+Gin框架中,可以利用中间件实现API防洪(防止用户频繁访问)功能。一种常见的防洪技术是利用Go的漏桶算法或令牌桶算法进行流量控制。以下面的Go代码为例,演示了一个简单的令牌桶方式的中间件:packagemainimport("net/http""time""github.com/gin-gonic/gin"......
  • 重新记录一下ArcGisEngine安装的过程
    前言好久不用Arcgis,突然发现想用时,有点不会安装了,所以这里记录一下安装过程。下载Arcgis首先,下载一个arcgis版本,我这里下的是10.1。推荐【gis思维(公众号)】,【麻辣GIS(网站)】。当然了,这都是很旧很旧的版本了,基本上没有三维功能。一定要下载带注册机的。arcgis的压缩包包含3......
  • Step by Step Data Replication Using Oracle GoldenGate
    1、Quickstarts2、ConfigureDeployments3、ManageDeploymentsfromtheServiceManager 4、ConfigureDataReplicationProcessesfromtheAdministrationService 5、ConfigurePathstoTransportTraiData 6、MonitorPathsandTrailsfromtheReceiver......
  • Nginx 反向代理
    nginx反向代理的好处提高访问速度因为nginx本身可以进行缓存,如果访问的同一接口,并且做了数据缓存,nginx就直接可把数据返回,不需要真正地访问服务端,从而提高访问速度。进行负载均衡所谓负载均衡,就是把大量的请求按照我们指定的方式均衡的分配给集群中的每台服务器。保......
  • 使用元类实现Django的ORM
    一、ORM基本介绍ORM是python编程语言后端web框架Django的核心思想,“ObjectRelationalMapping”,即对象-关系映射,简称ORM。二、实现目标创建一个实例对象,用创建它的类名当做数据表名,用创建它的类属性对应数据表的字段,当对这个实例对象操作时,能够对应MySQL语句如图:三、......
  • AtCoder Beginner Contest 345
    A-Leftrightarrow(abc345A)题目大意给定一个字符串,问是不是形如<======...====>的字符串。解题思路根据长度构造出期望的字符串,再判断是否相等即可。神奇的代码s=input()print("Yes"ifs=="<"+"="*(len(s)-2)+">"else"No")B-Inte......
  • nginx localtion 匹配规则
    1、语法规则 语法规则:location[=|~|^~*|^~]/uri/{…}表示精确匹配,这个优先级也是最高的^~表示uri以某个常规字符串开头,理解为匹配url路径即可。nginx不对url做编码,因此请求为/image/20%/aa,可以被规则^~/image//aa匹配到(注意是空格)。~表示区分......
  • 【机器学习入门 Machine Learning For Beginners】逻辑斯蒂回归和分类
    系列文章目录第1章专家系统第2章决策树第3章神经元和感知机识别手写数字——感知机第4章线性回归文章目录系列文章目录前言一、分类问题的数学形式二、最大似然估计三、交叉熵损失函数四、多类别分类多类别逻辑斯蒂回归归一化指数函数交叉熵误差和均方误差的......
  • gin框架函数语法
    引擎类:gin.Default()带中间件路由引擎gin.New()不带中间件路由引擎路由类:r.GET()查询接口r.POST()创建接口r.PUT()更新接口r.DELETE()删除接口r.Run()运行端口r.Static()模糊路径配置静态文件r.StaticFS()API路径配置静态文件r.StaticFile()精确路径配置静态文件r.L......