客服系统即时通讯IM开发(二)Golang + Gin框架实现服务端WebScoket【唯一客服】网站在线客服系统

惰性苔藓
• 阅读 1310

我的客服系统使用的Golang+ Gin作为后端服务,所以下面的代码是演示demo

在 Go 语言中使用 Gin 框架实现 WebSocket 的方法如下:

安装 gin-gonic/websocket 库。
在 Gin 的路由处理函数中使用 ws.Upgrade 函数将 HTTP 连接升级为 WebSocket 连接。
在路由处理函数中使用 conn.ReadMessage 和 conn.WriteMessage 函数接收和发送消息。
例如:

package main

import (
    "net/http"

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

var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

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

    r.GET("/ws", func(c *gin.Context) {
        conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
        if err != nil {
            http.NotFound(c.Writer, c.Request)
            return
        }

        for {
            // 读取消息
            _, message, err := conn.ReadMessage()
            if err != nil {
                break
            }

            // 发送消息
            err = conn.WriteMessage(websocket.TextMessage, message)
            if err != nil {
                break
            }
        }
    })

    r.Run()
}

上面的代码中,我们在 /ws 路由处理函数中使用 upgrader.Upgrade 函数将 HTTP 连接升级为 WebSocket 连接。然后,我们使用 conn.ReadMessage 函数读取消息,使用 conn.WriteMessage 函数发送消息。

前端连接Conn保存

我们需要把前端链接过来的WebSocket Conn保存下来,这样才可以在其他地方去调用这个Conn发送消息

可以使用一个全局的变量来保存前端连接。

例如,你可以使用一个全局的 map 类型变量来保存前端连接,这样就可以在其他地方访问连接了。

例如:

package main

import (
    "net/http"

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

var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true
    },
}

// 定义一个全局的 map 类型变量来保存前端连接
var connections = make(map[*websocket.Conn]bool)

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

    r.GET("/ws", func(c *gin.Context) {
        conn, err := upgrader.Upgrade(c.Writer, c.Request, nil)
        if err != nil {
            http.NotFound(c.Writer, c.Request)
            return
        }

        // 将连接保存到全局变量中
        connections[conn] = true

        for {
            // 读取消息
            _, message, err := conn.ReadMessage()
            if err != nil {
                delete(connections, conn)
                break
            }

            // 发送消息
            err = conn.WriteMessage(websocket.TextMessage, message)
            if err != nil {
                delete(connections, conn)
                break
            }
        }
    })

    r.Run()
}

上面的代码中,我们在每个前端连接建立时将连接保存到全局变量中,在连接断开时将连接从全局变量中删除。

在其他地方访问保存的前端连接,可以使用下面的代码:

for conn := range connections {
  err := conn.WriteMessage(websocket.TextMessage, []byte("消息内容"))
  if err != nil {
    delete(connections, conn)
  }
}

当然我们map全局变量,需要使用一个访客id标识来作为key,后面再详细说明

唯一在线客服系统
https://gofly.v1kf.com

十年开发经验程序员,离职全心创业中,历时三年开发出的产品《唯一客服系统》

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
雷厉风行 雷厉风行
2年前
Mac程序员软件-GoLand 2022 for Mac(最好用的GO语言编程软件)永久激活完美兼容版
JetBrainsGoLand是专门为Go编程语言设计的集成开发环境(IDE)。它提供了广泛的功能,例如代码完成、调试、测试工具以及与Git等版本控制系统的集成。GoLand还包括对Gin和Beego等流行Web框架的支持,使开发人员可以更轻松地使用Go构建Web应用程序。
隔壁老王 隔壁老王
4年前
我的gin框架笔记
入门教程https://golangcaff.com/docs/gingonic/2018/ginreadme/3961.下载gogetugithub.com/gingonic/gin2.在你的代码中导入它:import"github.com/gingonic/gin"3.(可选的)导入net/http
DevOpSec DevOpSec
4年前
redhat linux 中用锐捷客服端实现上网
开学了我们学校用的是锐捷的客服端连接外网,window下安装锐捷客服端实现上网很随意,但linux下却不是那么如鱼得水。我们校的很多同学都想用linux系统,但都因为安装锐捷客服端问题,不能上网,望而却步。     如今linux系统越来越火,为了攻破以上问题,结合网络上和自身的知识,总结出下方法:1.刚开始一直用xrgsu1.1.1.i386.
Wesley13 Wesley13
4年前
go保存文件到指定的文件夹
框架:gin语言:golang作用:保存文件到本地指定文件夹的一个小demo单文件保存到本地指定目录:packagemainimport("fmt""log""net/http""path""github.com/gingon
Easter79 Easter79
4年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
初探 Objective
作者:Cyandev,iOS和MacOS开发者,目前就职于字节跳动0x00前言异常处理是许多高级语言都具有的特性,它可以直接中断当前函数并将控制权转交给能够处理异常的函数。不同语言在异常处理的实现上各不相同,本文主要来分析一下ObjectiveC和C这两个语言。为什么要把ObjectiveC和
Stella981 Stella981
4年前
RabbitMQ实现即时通讯居然如此简单!连后端代码都省得写了?
摘要有时候我们的项目中会用到即时通讯功能,比如电商系统中的客服聊天功能,还有在支付过程中,当用户支付成功后,第三方支付服务会回调我们的回调接口,此时我们需要通知前端支付成功。最近发现RabbitMQ可以很方便的实现即时通讯功能,如果你没有特殊的业务需求,甚至可以不写后端代码,今天给大家讲讲如何使用RabbitMQ来实现即时通讯!MQ
数据堂 数据堂
2年前
语音数据集在智能客服系统中的应用与挑战
一、引言随着互联网和移动设备的普及,客户与企业的交互方式正在发生深刻变化。智能客服系统作为连接客户与企业的桥梁,发挥着越来越重要的作用。语音数据集在智能客服系统中具有广泛的应用,能够提高客户服务的效率和质量。本文将详细介绍语音数据集在智能客服系统中的应用、
惰性苔藓
惰性苔藓
Lv1
至今思项羽,不肯过江东。
文章
4
粉丝
0
获赞
0