Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >客服系统即时通讯IM开发(二)Golang + Gin框架实现服务端WebScoket【唯一客服】网站在线客服系统

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

作者头像
唯一Chat
发布于 2023-01-08 02:34:57
发布于 2023-01-08 02:34:57
94603
代码可运行
举报
文章被收录于专栏:陶士涵的菜地陶士涵的菜地
运行总次数:3
代码可运行

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

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

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

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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 类型变量来保存前端连接,这样就可以在其他地方访问连接了。

例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()
}

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for conn := range connections {
  err := conn.WriteMessage(websocket.TextMessage, []byte("消息内容"))
  if err != nil {
    delete(connections, conn)
  }
}

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

唯一在线客服系统

https://gofly.v1kf.com

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-01-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
客服系统即时通讯IM开发(三)访客实现一对一聊天-访客生成唯一id标识存储到全局变量【唯一客服】网站在线客服系统
如果你想在前端访客连接时生成一个 UUID,可以使用 Go 语言的第三方库来生成 UUID。
唯一Chat
2023/01/08
4960
客服系统即时通讯IM开发(四)网站实现实时在线访客列表【唯一客服】网站在线客服系统
用Go语言Gin框架实现的一个客服系统的WebSocket服务端。它允许客户端使用WebSocket协议连接到服务器并实时交换消息。
唯一Chat
2023/01/09
1.3K0
客服系统即时通讯IM开发(四)网站实现实时在线访客列表【唯一客服】网站在线客服系统
一周开发一个在线客服系统
使用 Go 和 Gin 框架开发在线客服系统是一种高效且性能优越的选择。以下是具体的开发计划,专注于使用 Gin 框架来实现后端:
唯一Chat
2024/05/21
4270
[Golang系列] GOFLY在线客服系统-gin框架升级http连接为websocket-GO语言实现开源独立部署客服系统
gin框架实现websocket服务非常简单,只需要升级一下http请求,就可以实现了
唯一Chat
2021/11/01
4480
golang怎么搭建Websocket聊天室服务端
我们用这个代码存储连接,便于后面服务器收到一个客户端的消息后向连接到服务器的每个客户端的连接发送消息,实现聊天交互
每周聚焦
2024/07/21
1710
golang怎么搭建Websocket聊天室服务端
Go语言实现Websocket服务端
如果想多个协程处理,handleMessages()调用多次即可,是不会导致处理信息重复的。
码客说
2024/03/29
1930
基于Golang + xtermjs构建Kubernetes多集群管理Web Terminal
近期,一位星球小伙伴入职新公司,之前习惯使用kubectl命令进行Kubernetes运维,但新公司所有集群都托管在阿里云ACK上。于是,他产生了一个想法:能否构建一个支持Kubernetes多集群管理的Web Terminal,通过kubectl命令来管理这些集群?答案是肯定的!接下来,我们将使用Golang和xtermjs来实现这一Kubernetes多集群管理Web Terminal。
用户1107783
2024/08/01
4552
基于Golang + xtermjs构建Kubernetes多集群管理Web Terminal
gin websocket 一对一聊天
依赖包 github.com/gin-gonic/gin github.com/gorilla/websocket 代码 创建ws/ws.go package ws import ( "encoding/json" "github.com/gin-gonic/gin" "github.com/gorilla/websocket" "log" "net/http" ) // ClientManager is a websocket manager type Clie
孤烟
2020/09/27
1.7K0
Go实现基于WebSocket的弹幕服务
1、数据更新频率低,则大多数请求是无效的 2、在线用户量多,则服务端的查询负载高 3、定时轮询拉取,实时性低
Clive
2018/12/06
1.8K0
go进阶-GO创建web服务+websocket详解
go提供了一系列用于创建web服务器的标准,而非常简单。只需要调用net/http包中的ListenAndServe函数并传入网络地址和负责处理的处理器就ok了。net/http库实现了整套的http服务中的客户端、服务端接口,可以基于此轻松的发起HTTP请求或者对外提供HTTP服务。
黄规速
2024/05/24
2.6K0
go进阶-GO创建web服务+websocket详解
golang一些常用库(6)
Gorilla WebSocket 提供了 WebSocket 协议的实现,用于实现实时通信。
dbdocker
2024/02/04
2130
给Go的Gin web框架增加 WebSocket 功能
Gin 是一个 go 的 web 框架,它具有轻量级,高性能,运行速度快,分组的路由器,良好的崩溃捕获和错误处理,非常好的支持中间件,rest api和json。
杨永贞
2021/01/18
8.3K0
Go WebSocket开发与测试实践【gorilla/websocket】
前文提到Go WebSocket开发与测试实践【/net/websocket】,今天分享一下另外一个Go WebSocket实现库gorilla/websocket,这个类库功能这也是我找到资料最多的实现方式。gorilla/websocket得到官方认可的库,如果大家使用Go语言做WebSocket的开发测试的话,我建议使用gorilla/websocket。
FunTester
2021/12/02
2.3K0
WebSocket
WebSocket是一种网络通信协议,它提供了一种在单个长连接上进行全双工通讯的方式。与传统的HTTP请求只能由客户端发起并由服务器响应不同,WebSocket允许服务器主动向客户端发送消息,实现了真正的双向交互。这一协议在2009年被提出,并随后成为国际标准。
孟斯特
2024/04/27
2680
WebSocket
【Golang】gorilla/websocket实战和底层代码分析
在【为什么有了http,还需要websocket,我懂了!】中介绍了web端即时通讯的方式,以及websocket如何进行连接、验证、数据帧的格式,这些都是了解websocket的基础知识。
小许code
2023/11/30
3.2K0
【Golang】gorilla/websocket实战和底层代码分析
Golang——WebSocket
拉模式的缺点 数据更新频率低,则大多数的请求是无效的 在线用户数量多,则服务端的查询负载高。 定时查询拉取,无法满足时效性要求 推送模式 尽在数据更新才推送,需要维护大量的在线长连接,数据更新后立即推送。
羊羽shine
2019/05/29
1.2K1
Go语言的WebSocket与实时通信
WebSocket 是一种基于 TCP 的协议,它允许客户端和服务器之间建立持久的连接,以实现实时通信。这种通信方式比传统的 HTTP 请求/响应模型更高效,因为它不需要建立和拆除连接,从而减少了网络延迟。
闻说社
2025/05/09
1220
Go语言的WebSocket与实时通信
浅学计网:Socket
Socket 并不是一个协议,而是为了方便使用TCP或UDP而抽象出来的一层,是位于应用层和传输控制层之间的一组接口。它可以被看作是一个门面模式,把复杂的TCP/IP协议族 隐藏在Socket接口后面,为上层应用提供了方便的使用方式,对用户来说,一组简单的接口就是全部,底层让Socket去组织数据,以符合指定的协议。
传说之下的花儿
2023/11/17
2780
浅学计网:Socket
Swoole与Go系列教程之WebSocket服务的应用
在 WebSocket 协议出现之前,Web 应用为了能过获取到实时的数据都是通过不断轮询服务端的接口。轮询的效率、延时很低,并且很耗费资源。在2008年 Google 的一位工程师 Ian Hickson 发明并起草了 Websocket 协议的相关规范,后来经过讨论和改进,由 WHATWG 组织负责制定了 WebSocket 的标准。最终,WebSocket 协议在2011年被正式发布为 RFC 6455 标准,同时得到了广泛应用和支持。WebSocket 协议的发明填补了 Web 应用中实时双向通信的空白,为大家提供了更便捷、高效的方式来开发实时性较强的应用程序,例如:聊天网站、在线游戏等一些需要进行实时数据交互的Web应用。
码农先森
2024/07/04
1040
使用Go语言创建WebSocket服务
今天介绍如何用Go语言创建WebSocket服务,文章的前两部分简要介绍了WebSocket协议以及用Go标准库如何创建WebSocket服务。第三部分实践环节我们使用了gorilla/websocket库帮助我们快速构建WebSocket服务,它帮封装了使用Go标准库实现WebSocket服务相关的基础逻辑,让我们能从繁琐的底层代码中解脱出来,根据业务需求快速构建WebSocket服务。
KevinYan
2020/03/26
6.7K0
推荐阅读
相关推荐
客服系统即时通讯IM开发(三)访客实现一对一聊天-访客生成唯一id标识存储到全局变量【唯一客服】网站在线客服系统
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档