使用Gin框架搭配WebSocket完成实时聊天

这篇具有很好参考价值的文章主要介绍了使用Gin框架搭配WebSocket完成实时聊天。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在写项目的时候,需要完成实时聊天的功能,于是简单的学习下WebSocket,想知道WebSocket是什么的小伙伴可以去网上别的地方学习一下。

要实现实时聊天,网上的大部分内容都是SpringBoot和WebSocket完成的,但是我使用Go写的,所以让我们来学习一下Gin框架搭配WebSocket完成实时聊天功能。

实时聊天

实时聊天的数据可以存到数据库,redis中,在这个小demo中没写相应的代码

聊天功能

package main

import (
	"encoding/json"
	"log"
	"net/http"
	"sync"

	"github.com/gorilla/websocket"
)

var (
	// 使用 sync.Map 来保存 WebSocket 连接的映射
	// key 是 userID,value 是 WebSocket 连接
	webSocketMap sync.Map
	// 记录在线人数
	onlineCount int
)

type Message struct {
	FromUserID string `json:"fromUserId"`
	ToUserID   string `json:"toUserId"`
	// 其他字段...
}

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

	// 从 URL 中获取 userId
	// userId 为发送者
	// toUserId 为接收者
	userId := r.URL.Query().Get("userId")
	toUserId := r.URL.Query().Get("toUserId")

	// 升级 HTTP 连接为 WebSocket 连接
	conn, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Println("WebSocket upgrade error:", err)
		return
	}

	// 注册 WebSocket 连接
	webSocketMap.Store(userId, conn)
	addOnlineCount()

	log.Println("用户连接:", userId, ",当前在线人数为:", getOnlineCount())

	// 发送消息
	sendMessage(userId, "连接成功")

	// 接收消息并处理
	for {
		_, message, err := conn.ReadMessage()
		if err != nil {
			// 关闭连接并从映射中删除
			conn.Close()
			webSocketMap.Delete(userId)
			subOnlineCount()

			log.Println("用户退出:", userId, ",当前在线人数为:", getOnlineCount())
			break
		}

		log.Println("用户消息:", userId, ",报文:", string(message))

		// 解析 JSON
		var msg Message
		if err := json.Unmarshal(message, &msg); err != nil {
			log.Println("Error parsing JSON:", err)
			continue
		}

		// 追加发送人(防止串改)
		msg.FromUserID = userId
		msg.ToUserID = toUserId

		// 传送给对应 ToUserID 用户的 WebSocket
		if msg.ToUserID != "" {
			sendMessage(msg.ToUserID, "收到来自用户 "+userId+" 的消息:"+string(message))
		} else {
			sendMessage(userId, "消息发送失败,目标用户不存在")
		}
	}
}

func sendMessage(userID, message string) {
	if conn, ok := webSocketMap.Load(userID); ok {
		conn.(*websocket.Conn).WriteMessage(websocket.TextMessage, []byte(message))
	}
}

func getOnlineCount() int {
	return onlineCount
}

func addOnlineCount() {
	onlineCount++
}

func subOnlineCount() {
	onlineCount--
}

func main() {
	http.HandleFunc("/ws", handleWebSocket)
	http.ListenAndServe(":8080", nil)
}

测试

使用https://websocket.jsonin.com/进行测试(两个网页)

第一个测试URL:ws://127.0.0.1:8080/ws?userId=1&toUserId=2 表示用户1要给用户2发送信息

第二个测试URL:ws://127.0.0.1:8080/ws?userId=2&toUserId=1 表示用户2要给用户1发送信息

第一个连接成功:

使用Gin框架搭配WebSocket完成实时聊天,gin,websocket,网络协议
第二个连接成功:

使用Gin框架搭配WebSocket完成实时聊天,gin,websocket,网络协议
控制台信息:

使用Gin框架搭配WebSocket完成实时聊天,gin,websocket,网络协议

发送信息

now,发送信息测试,在第一个测试中直接点击发送(好像只能发送json格式的,反正我知道数字类型的发送不到第二个测试)

使用Gin框架搭配WebSocket完成实时聊天,gin,websocket,网络协议
第二个测试中接收到第一个测试中发来的信息

使用Gin框架搭配WebSocket完成实时聊天,gin,websocket,网络协议
在测试二中同上。

控制台中信息

使用Gin框架搭配WebSocket完成实时聊天,gin,websocket,网络协议文章来源地址https://www.toymoban.com/news/detail-604198.html

到了这里,关于使用Gin框架搭配WebSocket完成实时聊天的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • GoWeb -- gin框架的入门和使用(2)

    书接上回,在gin的框架使用中,还有着许多方法以及它们的作用,本篇博客将会接着上次的内容继续记录本人在学习gin框架时的思路和笔记。 如果还没有看过上篇博客的可以点此跳转。 请求url: http://localhost:8080/user/save?addressMap[home]=BeijingaddressMap[company]=shanghai 一般我们使用

    2024年02月07日
    浏览(27)
  • gin框架使用系列之三——获取表单数据

    系列目录 《gin框架使用系列之一——快速启动和url分组》 《gin框架使用系列之二——uri占位符和占位符变量的获取》 get请求的参数是直接加在url后面的,在gin中获取get请求的参数主要用Query()和DefaultQuery()两个方法,示例代码如下 在浏览器中输入全部参数的运行如下: 如果

    2024年02月04日
    浏览(29)
  • [golang gin框架] 26.Gin 商城项目-前台自定义商品列表模板, 商品详情数据渲染,Markdown语法使用

    当在首页分类点击进入分类商品列表页面时,可以根据后台分类中的分类模板跳转到对应的模板商品列表页面 (1).商品控制器方法Category()完善 修改controllers/frontend/productController.go中的方法Category(), 判断分类模板,如果后台没有设置,则使用默认模板 (2).模板页面案例 先来回顾一

    2024年02月01日
    浏览(40)
  • 使用Go-Gin框架实现 OSS 前端直传功能

    在现代 Web 应用中,文件上传是一项常见功能。传统的上传方式通常需要文件经过后端服务器转发到对象存储服务(如阿里云 OSS)。然而,这种方法可能对服务器造成额外的负担,并降低上传效率。本文将探讨如何使用 Go-Gin 框架实现 OSS 前端直传,从而提高效率并减轻服务器

    2024年01月18日
    浏览(44)
  • Go 语言之在 gin 框架中使用 zap 日志库

    gin.Default() 的源码 Logger(), Recovery() 实操 运行并访问:http://localhost:8080/hello test.log 其它参考:https://github.com/gin-contrib/zap

    2024年02月09日
    浏览(28)
  • [golang gin框架] 37.ElasticSearch 全文搜索引擎的使用

    ElasticSearch 是一个基于 Lucene 的 搜索服务器 ,它提供了一个 分布式多用户 能力的 全文搜索引擎 ,基于 RESTful web 接口,Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎,设计用于云计算中,能够达到 实时搜索 , 稳定 , 可靠

    2024年02月11日
    浏览(45)
  • golang Gin实现websocket

    golang使用 Gin实现 websocket,这里笔者重新搭建一个项目 项目名为 go-gin-websocket 在指定文件夹下,新建项目文件夹 go-gin-websocket 进入项目文件夹,打开cmd窗口,在项目(go-gin-websocket)文件夹路径下,执行初始化命令 go mod init go-gin-websocket 安装依赖 安装gin  安装websocket 在项

    2024年02月06日
    浏览(39)
  • gin 框架中的 gin.Context

    Context 是 gin 中最重要的部分。 例如,它允许我们在中间件之间传递变量、管理流程、验证请求的 JSON 并呈现 JSON 响应。 Context 中封装了原生的 Go HTTP 请求和响应对象,同时还提供了一些方法,用于获取请求和响应的信息、设置响应头、设置响应状态码等操作。 在 Gin 中,C

    2024年02月14日
    浏览(28)
  • websocket协议以及在gin中的应用

    WebSocket 是一种在单个 TCP 连接上进行全双工通信的协议。WebSocket 通信协议于 2011 年被 IETF 定为标准 RFC6455,并由 RFC7936 补充规范。(RFC 是一系列以编号排定的文件,它由一系列草案和标准组成。几乎所有互联网通信协议均记录在 RFC 中,例如 HTTP 协议标准、 WebSocket 协议标准

    2024年02月06日
    浏览(30)
  • Gin框架: 使用go-ini配置参数与不同环境下的配置部署

    关于 INI 配置文件与go-ini 1 )概述 在INI配置文件中可以处理各种数据的配置 INI文件是一种简单的文本格式,常用于配置软件的各种参数 go-ini 是地表 最强大、最方便 和 最流行 的 Go 语言 INI 文件操作库 Github 地址:https://github.com/go-ini/ini 官方文档: https://ini.unknwon.io/ 使用示例

    2024年02月22日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包