Golang WebSocket Ping Pong

在 Web 开发中,实时通信是一项非常重要的功能。通过实时通信,我们可以实现一些实时更新的功能,如实时聊天、实时数据更新、多人游戏等。而 WebSocket 是一种在 Web 开发中常用的实现实时通信的技术。本文将介绍如何使用 Golang 实现 WebSocket 的 Ping Pong 功能,以确保连接的存活性。

什么是 WebSocket

WebSocket 是一种在 Web 开发中用于实现实时通信的协议。与传统的 HTTP 协议不同,WebSocket 允许服务器主动向客户端推送数据,而不需要客户端发起请求。这使得实时通信成为可能,且具有较低的延迟和较高的性能。

WebSocket 协议通过在客户端和服务器之间建立持久连接来实现实时通信。它通过在 HTTP 请求头中添加特殊的标志来升级到 WebSocket 连接。一旦连接建立成功,客户端和服务器就可以通过发送消息来进行实时通信,而不需要每次都发起新的 HTTP 请求。

为什么需要 Ping Pong

在 WebSocket 连接建立后,客户端和服务器之间的连接可能会因为各种原因中断,如网络故障、服务器重启等。为了保持连接的存活性,我们需要一种机制来检测连接是否还处于活动状态。这就是 Ping Pong 机制的作用。

Ping Pong 机制通过定期发送 Ping 消息来检测连接是否还活着。当服务器接收到 Ping 消息后,会立即回复一个 Pong 消息作为响应。如果客户端在一定时间内没有收到 Pong 消息,就可以认为连接已经中断,然后重新建立连接。

使用 Ping Pong 机制可以有效地保持 WebSocket 连接的存活性,并及时处理连接中断的情况。这对于需要长时间保持连接的应用非常重要,如实时聊天、实时数据更新、多人游戏等。

使用 Golang 实现 Ping Pong

在 Golang 中,我们可以使用 gorilla/websocket 包来实现 WebSocket 的功能。这个包提供了方便的接口和工具函数,可以简化 WebSocket 的开发。

首先,我们需要引入 gorilla/websocket 包:

import ("github.com/gorilla/websocket"
)

然后,我们需要创建一个 Upgrader 对象,用于升级 HTTP 请求到 WebSocket 连接:

var upgrader = websocket.Upgrader{}

接下来,我们可以使用 Upgrade 函数将 HTTP 请求升级到 WebSocket 连接:

func handleWebSocket(w http.ResponseWriter, r *http.Request) {conn, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Println(err)return}// 处理 WebSocket 连接// ...
}

在上面的代码中,conn 是一个 *websocket.Conn 类型的对象,表示与客户端的 WebSocket 连接。我们可以通过这个对象来发送和接收消息。

现在,我们可以在连接建立后开始实现 Ping Pong 机制。我们首先需要在连接建立后启动一个 Goroutine,用于发送 Ping 消息:

go func() {for {err := conn.WriteMessage(websocket.PingMessage, []byte{})if err != nil {log.Println(err)break}time.Sleep(time.Second * 5)}
}()

在上面的代码中,我们使用 WriteMessage 函数发送一个 Ping 消息。websocket.PingMessage 是一个常量,表示 Ping 消息的消息类型。我们可以将一个空的字节数组作为消息内容,因为 Ping 消息不需要携带任何数据。

然后,我们可以在连接建立后启动一个 Goroutine,用于接收 Pong 消息:

go func() {for {_, _, err := conn.ReadMessage()if err != nil {log.Println(err)break}}
}()

在上面的代码中,我们使用 ReadMessage 函数接收 Pong 消息。由于 Pong 消息不需要处理具体的消息内容,所以我们只关注是否发生了错误即可。

通过以上代码,我们就可以实现 Ping Pong 机制。在连接建立后,我们会定期发送 Ping 消息,并等待 Pong 消息的响应。如果一段时间内没有收到 Pong 消息,就可以认为连接已经中断,然后进行相应的处理。

保持连接存活性的其他方法

除了 Ping Pong 机制外,还有其他一些方法可以保持 WebSocket 连接的存活性。

第一种方法是使用心跳包。在连接建立后,我们可以定期向客户端发送心跳包进行检测。客户端在收到心跳包后,可以立即回复一个响应,以表示连接仍然存活。如果一段时间内没有收到心跳包的响应,就可以认为连接已经中断,然后进行相应的处理。

第二种方法是重新连接。在连接断开后,我们可以通过一些手段来重新建立连接,以保持连接的存活性。例如,我们可以在连接断开时显示一个提示框,让用户点击重新连接按钮来重新建立连接。或者,我们可以在客户端定期尝试重新连接,直到连接成功为止。

第三种方法是使用 WebSocket 的 keepalive 选项。一些浏览器和服务器支持 WebSocket 的 keepalive 选项,它允许服务器定期发送 Ping 消息,以保持连接的存活性。如果浏览器和服务器都支持这个选项,我们可以简化 Ping Pong 机制的实现,直接使用 keepalive 选项即可。

案例

案例一:实时聊天应用

假设我们正在开发一个实时聊天应用,需要保持与服务器的 WebSocket 连接。在这种情况下,我们可以使用 Ping Pong 机制来检测连接的存活性。

服务器端的代码可以在连接建立后启动一个 Goroutine,定期发送 Ping 消息:

go func() {for {err := conn.WriteMessage(websocket.PingMessage, []byte{})if err != nil {log.Println(err)break}time.Sleep(time.Second * 5)}
}()

客户端的代码可以在收到 Ping 消息后,立即回复一个 Pong 消息:

connection.onmessage = function(event) {if (event.data === 'ping') {connection.send('pong');}
};

通过以上代码,我们可以保持与服务器的 WebSocket 连接的存活性,并在连接中断时进行相应的处理,如重新建立连接或显示提示信息。

案例二:实时数据更新应用

假设我们正在开发一个实时数据更新应用,需要保持与服务器的 WebSocket 连接,以接收最新的数据。在这种情况下,我们可以使用 Ping Pong 机制来检测连接的存活性。

服务器端的代码可以在连接建立后启动一个 Goroutine,定期发送 Ping 消息:

go func() {for {err := conn.WriteMessage(websocket.PingMessage, []byte{})if err != nil {log.Println(err)break}time.Sleep(time.Second * 5)}
}()

客户端的代码可以在收到 Ping 消息后,立即回复一个 Pong 消息,并进行相应的数据更新操作:

connection.onmessage = function(event) {if (event.data === 'ping') {connection.send('pong');// 更新数据updateData();}
};

通过以上代码,我们可以保持与服务器的 WebSocket 连接的存活性,并及时更新最新的数据。

案例三:多人游戏应用

假设我们正在开发一个多人游戏应用,需要保持与服务器的 WebSocket 连接,以实现实时游戏交互。在这种情况下,我们可以使用 Ping Pong 机制来检测连接的存活性。

服务器端的代码可以在连接建立后启动一个 Goroutine,定期发送 Ping 消息:

go func() {for {err := conn.WriteMessage(websocket.PingMessage, []byte{})if err != nil {log.Println(err)break}time.Sleep(time.Second * 5)}
}()

客户端的代码可以在收到 Ping 消息后,立即回复一个 Pong 消息,并进行相应的游戏操作:

connection.onmessage = function(event) {if (event.data === 'ping') {connection.send('pong');// 处理游戏逻辑handleGameLogic();}
};

通过以上代码,我们可以保持与服务器的 WebSocket 连接的存活性,并实时处理游戏逻辑,保证多人游戏的顺畅交互。

这些案例展示了如何在不同的应用场景中使用 Golang 实现 WebSocket 的 Ping Pong 功能,以确保连接的存活性。根据具体的需求,我们可以灵活地调整 Ping Pong 的时间间隔和相应的处理逻辑。

总结

在本文中,我们介绍了如何使用 Golang 实现 WebSocket 的 Ping Pong 功能,以确保连接的存活性。通过定期发送 Ping 消息并等待 Pong 消息的响应,我们可以有效地检测连接是否还活着,并及时处理连接中断的情况。

WebSocket 的 Ping Pong 机制是保持连接存活性的一种重要方法,特别适用于需要长时间保持连接的应用,如实时聊天、实时数据更新、多人游戏等。除了 Ping Pong 机制外,还有其他一些方法可以保持连接的存活性,如心跳包、重新连接和使用 WebSocket 的 keepalive 选项。

在实际应用中,我们可以根据具体的需求来选择适合的方法来保持连接的存活性。希望本文对您在使用 Golang 实现 WebSocket 的 Ping Pong 功能方面有所帮助,谢谢阅读!

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

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

相关文章

[架构之路-255]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 架构设计 - 软件架构风格

目录 前言: 一、建筑风格 1.1 什么是建筑风格 1.2 常见的建筑风格 1.3 如何区分不同的建筑风格 二、软件架构风格概述 2.1 什么是软件架构风格 2.2 如何区分不同的软件架构风格 2.3 软件架构风格的发展阶段 2.4 软件架构风格与软件架构的区别 2.5 常见的…

数字图像处理(实践篇)十五 基于傅里叶变换的高通滤波和低通滤波

目录 一 Numpy 实现傅里叶变换 1 涉及的函数 2 实践 二 OpenCV 实现傅里叶变换 1 涉及的函数 2 实践 为了有效地和快速地对图像进行处理和分析,常常需要将原定义在图像空间的图像以某种形式转换(正变换)到另外一些空间,并利…

使用gparted进行ubuntu虚拟机的磁盘扩容(解决gparted无法拖动分区的问题)

在学习内核编译下载linux内核源码的时候,由于源码非常大,下载的时候提示磁盘空间不足,我才意识到刚开始创建虚拟机的时候分配了20GB的空间现在已经快用光了。在VM的设置里可以进行扩容,我扩展到了30GB重启却发现空间并没有加到我使…

数据库应用:MongoDB 文档与索引管理

目录 一、理论 1.MongoDB文档管理 2.MongoDB索引管理 二、实验 1.MongoDB文档管理 2.MongoDB索引管理(索引添加与删除) 3.MongoDB索引管理(全文索引) 4.MongoDB索引管理(多列索引) 5.MongoDB索引管…

【PyTorch】(一)简介

1. PyTorch是什么? PyTorch是一个深度学习框架,由Facebook于2016年开源发布。PyTorch是基于Torch框架的Python接口,旨在提供易用的强大工具来进行神经网络的构建和训练。PyTorch使用动态计算图,使得开发人员可以以类似于NumPy的方…

虚拟数字人有什么用?有哪些应用场景?

​​过去三年,元宇宙概念进入到大众视野,虚拟数字人备受关注。抖音达人柳夜熙、洛天依、网红虚拟偶像AYAYI等,随着元宇宙的流行,数字人也逐渐成为一种趋势。据行业预测,到2030年,中国的数字人总市场规模将达…

APITable免费开源的多维表格与可视化数据库本地部署公网远程访问

APITable免费开源的多维表格与可视化数据库公网远程访问 文章目录 APITable免费开源的多维表格与可视化数据库公网远程访问前言1. 部署APITable2. cpolar的安装和注册3. 配置APITable公网访问地址4. 固定APITable公网地址 前言 vika维格表作为新一代数据生产力平台&#xff0c…

Oracle很好的自动拼接某个字段的函数listagg使用实例

with mes1 as ( select c.cugrnname,cdd.cuassociatepackingname,c.cuReceiveTime,c.cuReceivePerson, CASE WHEN c.custatus 1 THEN N已发送 ELSE N已接收 END custatus ,c.cuSendTime, c.cuSendPerson,cdd.cupackingworkcenter,cdd.cuqty,pb.PRODUCTNAME,p.description…

关于高校电子邮件系统开通双因素认证的经验分享-以清华大学为例

清华大学信息化技术中心 马云龙 作者简介: 马云龙,男,清华大学信息化技术中心高级工程师;Coremail管理员社区大咖嘉宾 深耕高校计算机网络/信息化/网络安全岗位20年,对大规模计算机网络及信息系统规划,开发/建设,运维有深刻体会。 目前,越来越多的高校/企业/政府机关…

我与开源的历程

我在2000年开始接触开源,当时在松下航空电子美国总部工作。我负责将 IFE 系统从 Win31 迁移到 Linux。作为一个完全不懂 Linux 的小白,我不得不找到一台笔记本电脑安装并自学 Redhat Linux 6.1。2003年回到新加坡后,我发现没有一个凝聚 Linux…

最新AI创作系统ChatGPT系统运营源码+DALL-E3文生图+支持OpenAI-GPT全模型+国内AI全模型

一、AI创作系统 SparkAi创作系统是基于ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI…

ros来保存图像和保存记录视频的方法---gmsl相机保存视频和图片

1,保存图片 rosrun image_view image_view image:=/myimg_topic这个命令只是用来查看图像的,它并不会保存图像。如果你想要保存图像,你需要使用image_saver节点,并指定保存路径。例如: 下面指令就可以了,可以用 rosrun image_view image_saver image:=/myimg_topic _fi…

centos7下执行yum命令报错

前言 在Linux系统中,安装nginx时候,需要先安装环境。 Nginx是使用C语言开发,安装nginx需要先从官网上将源码下载,然后编译,编译需要gcc环境,但是在安装gcc环境的时候,执行命令报错。 yum install –y gcc-…

Java零基础——Redis篇

1.【熟悉】NoSQL的简介 1.1 什么是NoSQL NoSQL 是 Not Only SQL 的缩写,意即"不仅仅是SQL"的意思,泛指非关系型的数据库。强调Key-Value Stores和文档数据库的优点。 NoSQL产品是传统关系型数据库的功能阉割版本,通过减少用不到或…

易宝OA ExecuteSqlForSingle SQL注入漏洞复现

0x01 产品简介 易宝OA系统是一种专门为企业和机构的日常办公工作提供服务的综合性软件平台,具有信息管理、 流程管理 、知识管理(档案和业务管理)、协同办公等多种功能。 0x02 漏洞概述 易宝OA ExecuteSqlForSingle接口处存在SQL注入漏洞&a…

正则表达式(Regular Exprerssion)in Python

之前帮一位朋友面大模型微调实习岗位的时候,人家面试官考到了正则表达式,感觉这块知识还是挺重要的,所以浅浅的学习一下,每个小部分的代码在后面 目录 0.先从一个案例入手(提取文本中的电子邮件地址) 代码…

qt 5.15.2压缩和解压缩功能

qt 5.15.2压缩和解压缩功能 主要是添加qt项目文件.pro内容: 这里要先下载quazip的c项目先编译后引入到本项目中/zip目录下 INCLUDEPATH ./zip CONFIG(debug, debug|release) {win32:win32-g: PRE_TARGETDEPS $$PWD/zip/libquazipd.awin32:win32-g: LIBS -L$$PWD…

基于Netty的网络调用实现

作为一个分布式消息队列,通信的质量至关重要。基于TCP协议和Socket实现一个高效、稳定的通信程序并不容易,有很多大大小小的“坑”等待着经验不足的开发者。RocketMQ选择不重复发明轮子,基于Netty库来实现底层的通信功能。 1 Netty介绍 Net…

Python如何优雅的写包——Packages

Python中的函数(Function)、类(Class)、模块(Module)、包库(Package),都是为了实现模块化引用,让程序的组织更清晰有条理。 通常,函数、变量、类存储在被称为模块(Module)的.py文件中,一组模块文件又组成了包(Package)。将函数、…

【pytorch】深度学习入门一:pytorch的安装与配置(Windows版)

请支持原创,认准DannisTang(tangweixuan1995foxmail.com) 文章目录 第〇章 阅读前提示第一章 准备工作第一节 Python下载第二节 Python安装第三节 Python配置第四节 Pycharm下载第五节 Pycharm安装第六节 CUDA的安装 第二章 Anaconda安装与配…