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

文章目录

    • 前言
    • 实时聊天
      • 聊天功能
      • 测试
      • 发送信息

前言

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

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

实时聊天

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

聊天功能

package mainimport ("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))// 解析 JSONvar msg Messageif err := json.Unmarshal(message, &msg); err != nil {log.Println("Error parsing JSON:", err)continue}// 追加发送人(防止串改)msg.FromUserID = userIdmsg.ToUserID = toUserId// 传送给对应 ToUserID 用户的 WebSocketif 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发送信息

第一个连接成功:

在这里插入图片描述
第二个连接成功:

在这里插入图片描述
控制台信息:

在这里插入图片描述

发送信息

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

在这里插入图片描述
第二个测试中接收到第一个测试中发来的信息

在这里插入图片描述
在测试二中同上。

控制台中信息

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/5539.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Rust操作MySQL

查询 本部分是对 「Rust入门系列」Rust 中使用 MySQL[1]的学习与记录 经常使用的时间处理库: chrono 流式查询使用: query_iter 输出到Vec使用: query 映射到结构体使用: query_map 获取单条数据使用: query_first 命名…

小程序体验版上线注意事项

1.接口域名必须是https,有ssh证书。不能用ip地址。 2.需要在微信公众平台进行配置 微信公众平台->开发-> 开发管理->开发设置 对服务器域名和业务域名进行配置对业务域名进行配置时,需要下载校验文件,放在域名根目录下

【Node.js 安装】Node.js安装与使用教程

Node.js 安装 Node.js 是什么那什么是运行时 如何安装 Node.jsNode 使用教程 Node.js 是什么 先说结论,Node.js 它是一套 JavaScript 运行环境,用来支持 JavaScript 代码的执行 JavaScript 诞生于 1995 年,几乎是和互联网同时出现&#xf…

十分钟掌握 Vim 编辑器核心功能

十分钟掌握 Vim 编辑器核心功能 文章目录 十分钟掌握 Vim 编辑器核心功能👨‍🏫内容一:前言【Vim是什么】👨‍🔬内容二:Vim 常用模式👨‍🚀内容三:基本操作👨…

【C语言】表达式求值相关问题汇总—>隐式类型转换(整型提升)、算数转换与操作符优先级汇总(收藏查阅)

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》 🌝每一个不曾起舞的日子,都是对生命的辜负。 目录 前言: 一、隐式类型转换 (一)整型提升的意义…

Dubbogo 详解

Dubbogo 详解 简介 dubbo功能很强大的微服务开发框架,支持多种通信协议,并具有流量治理的功能。 dubbo在有了大转变,拥抱了云原生,从哪些方面可以体现呢? 推出了自己的Trip协议修复了服务发现的级别,之…

华为云CodeArts产品体验的心得体会及想法

文章目录 前言CodeArts 的产品优势一站式软件开发生产线研发安全Built-In华为多年研发实践能力及规范外溢高质高效敏捷交付 功能特性说明体验感受问题描述完结 前言 华为云作为一家全球领先的云计算服务提供商,致力于为企业和个人用户提供高效、安全、可靠的云服务。…

算法与数据结构(二十一)前缀和数组差分数组

前缀和技巧适用于快速、频繁地计算一个索引区间内的元素之和。 1. 一维数组中的前缀和 先看一道例题,力扣第 303 题「区域和检索 - 数组不可变」,让你计算数组区间内元素的和,这是一道标准的前缀和问题: 题目要求你实现这样一个…

【C++初阶】---C++入门篇

文章目录 前言🌟一、C历史介绍🌟二、命名空间🌏2.1.C与C对比🌏2.2.命名空间的引入🌏2.3.命名空间定义🌏2.4.命名空间的使用🌏2.5.对上述C与C对比中的第二个不同点的解释: &#x1f3…

TableGPT: Towards Unifying Tables, Nature Language and Commands into One GPT

论文标题:TableGPT: Towards Unifying Tables, Nature Language and Commands into One GPT 论文地址:https://github.com/ZJU-M3/TableGPT-techreport/blob/main/TableGPT_tech_report.pdf 发表机构:浙江大学 发表时间:2023 本文…

使用GGML和LangChain在CPU上运行量化的llama2

Meta AI 在本周二发布了最新一代开源大模型 Llama 2。对比于今年 2 月发布的 Llama 1,训练所用的 token 翻了一倍,已经达到了 2 万亿,对于使用大模型最重要的上下文长度限制,Llama 2 也翻了一倍。 在本文,我们将紧跟趋…

【NLP】使用 Keras 保存和加载深度学习模型

一、说明 训练深度学习模型是一个耗时的过程。您可以在训练期间和训练后保存模型进度。因此,您可以从上次中断的地方继续训练模型,并克服漫长的训练挑战。 在这篇博文中,我们将介绍如何保存模型并使用 Keras 逐步加载它。我们还将探索模型检查…

JavaSwing+MySQL的酒店管理系统

点击以下链接获取源码: https://download.csdn.net/download/qq_64505944/88063706?spm1001.2014.3001.5503 JDK1.8、MySQL5.7 功能:散客开单:完成散客的开单,可一次最多开5间相同类型的房间。 2、团体开单:完成团体…

【论文笔记】KDD2019 | KGAT: Knowledge Graph Attention Network for Recommendation

Abstract 为了更好的推荐,不仅要对user-item交互进行建模,还要将关系信息考虑进来 传统方法因子分解机将每个交互都当作一个独立的实例,但是忽略了item之间的关系(eg:一部电影的导演也是另一部电影的演员&#xff09…

醉梦仙踪:二叉树狂想曲,中序遍历的华丽穿梭

本篇博客会讲解力扣“94. 二叉树的中序遍历”的解题思路,这是题目链接。 如何对二叉树进行中序遍历呢?所谓中序遍历,即先遍历左子树,接着遍历根节点,最后遍历右子树的一种遍历方式。具体来说,假设有某一种“…

htmlCSS-----背景样式

目录 前言: 背景样式 1.背景颜色 background-color 2.背景图片 background-image 背景的权重比较 代码示例: 前言: 很久没写文章了,会不会想我呢!今天我们开始学习html和CSS的背景样式以及文字样式&#xff…

qt 5.12.6配置 msvc2015 32bit

qt 5.12.6配置 msvc2015 32bit 1.添加临时档案库2.安装 msvc20153. 配置 qmake 环境4.修改系统环境变量5.问题修改1.qt没有被正确的安装,请运行make install2.QT编译出错:rc不是内部或外部命令,也不是可运行的程序 或批处理文件。3.QT License check fai…

【Selenium+Pytest+allure报告生成自动化测试框架】附带项目源码和项目部署文档

目录 前言 【文章末尾给大家留下了大量的福利】 测试框架简介 首先管理时间 添加配置文件 conf.py config.ini 读取配置文件 记录操作日志 简单理解POM模型 简单学习元素定位 管理页面元素 封装Selenium基类 创建页面对象 简单了解Pytest pytest.ini 编写测试…

php使用PDO_sqlsrv

php拓展下载:Microsoft Drivers for PHP 发行说明 - PHP drivers for SQL Server | Microsoft Learn 参考文章:php7.3.4 pdo方式连接sqlserver 设置方法_pdo sqlserver_黑贝是条狗的博客-CSDN博客 php5.6.9安装sqlsrv扩展(windows&#xff0…

CXL Bias Mode (1) - Bias Mode 背景与分类

🔥点击查看精选 CXL 系列文章🔥 🔥点击进入【芯片设计验证】社区,查看更多精彩内容🔥 📢 声明: 🥭 作者主页:【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…