讲师中心 微信公众号
AI工具推荐 视频效率加速

Go 语言中 WebSocket 多连接频繁断开,如何解决?

轻伟吖_8258

轻伟吖_8258

发布时间:2024-10-26 17:33:10

|

1297人浏览过

|

来源于php中文网

原创

go 语言中 websocket 多连接频繁断开,如何解决?

在 go 语言中使用 websocket 建立多个连接时可能会出现频繁断开的问题。这可能是由于未能正确处理并发连接导致的。以下是如何解决此问题的建议:

你的代码中,使用 go func() 函数以并发的形式调用发送心跳消息的匿名函数。这意味着该函数会在一个独立 goroutine 中运行,同时 websocket 连接也在另一个 goroutine 中运行。这两个 goroutine 可能以不同的速度执行,导致发送心跳消息不及时,从而导致连接断开。

为了解决这个问题,可以采用以下方法:

  • 使用一个带有锁(sync.mutex 或 sync.rwmutex)的单一 goroutine 来处理所有 websocket 连接。
  • 使用通道来在 goroutine 之间进行通信。

这里是一个示例代码,演示了使用通道来处理 websocket 连接:

type Device struct {
    online bool
    ws     *websocket.Conn
    msgCh  chan string
}

func DeviceRequestProc(ws *websocket.Conn) {
    defer ws.Close()
    defer ws.Request().Body.Close()

    _ = ws.Request().ParseForm()
    mac := ws.Request().Form.Get("id")

    log.Println("设备", ws.Request().RemoteAddr, "[", mac, "] websocket 连接建立")

    dev := devInfo.getDeviceByMac(mac)
    if dev == nil {
        _ = websocket.Message.Send(ws, "未找到对应设备配置")
        log.Println("设备", ws.Request().RemoteAddr, "[", mac, "] websocket 连接未找到对应设备")
        return
    }

    dev.online = true
    dev.ws = ws
    dev.msgCh = make(chan string)

    go dev.WSCheck()
    go dev.ProcessWSMsg()

    for {
        select {
        case msg := <-dev.msgCh:
            if err := websocket.Message.Send(ws, msg); err != nil {
                break
            }
        }
    }

    dev.online = false
    dev.ws = nil
    log.Println("设备", ws.Request().RemoteAddr, "[", ws.Request().Form.Get("id"), "] websocket 连接断开")
}

func (d *Device) WSCheck() {
    for d.online {
        d.msgCh <- fmt.Sprintf(`{"eventType":"sundyn_ws_check","time":"%s"}`, time.Now().Format("2006-01-02 15:04:05"))
        time.Sleep(time.Second * 20)
    }
}

func (d *Device) ProcessWSMsg() {
    for {
        if !d.online {
            return
        }

        // 此处阻塞,等待有数据可读
        var reply string
        if err := websocket.Message.Receive(d.ws, &reply); err != nil {
            break
        }

        d.ProcessWSMsg(reply)
    }
}

通过使用通道来通信,两个 goroutine 可以有序地交换消息,从而确保发送心跳消息及时且可靠。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
Golang WebSocket与实时通信开发
Golang WebSocket与实时通信开发

本专题系统讲解 Golang 在 WebSocket 开发中的应用,涵盖 WebSocket 协议、连接管理、消息推送、心跳机制、群聊功能与广播系统的实现。通过构建实际的聊天应用或实时数据推送系统,帮助开发者掌握 如何使用 Golang 构建高效、可靠的实时通信系统,提高并发处理与系统的可扩展性。

175

2025.12.22

PHP WebSocket 实时通信开发
PHP WebSocket 实时通信开发

本专题系统讲解 PHP 在实时通信与长连接场景中的应用实践,涵盖 WebSocket 协议原理、服务端连接管理、消息推送机制、心跳检测、断线重连以及与前端的实时交互实现。通过聊天系统、实时通知等案例,帮助开发者掌握 使用 PHP 构建实时通信与推送服务的完整开发流程,适用于即时消息与高互动性应用场景。

416

2026.01.19

Python WebSocket实时通信与异步服务开发实践
Python WebSocket实时通信与异步服务开发实践

本专题聚焦 Python 在实时通信场景中的开发实践,系统讲解 WebSocket 协议原理、长连接管理、消息推送机制以及异步服务架构设计。内容包括客户端与服务端通信实现、连接稳定性优化、消息队列集成及高并发处理策略。通过完整案例,帮助开发者构建高效稳定的实时通信系统,适用于聊天应用、实时数据推送等场景。

1095

2026.03.18

WebSocket 前端开发与实战技巧
WebSocket 前端开发与实战技巧

聚焦 WebSocket 在前端项目中的工程化实践,涵盖原生 JavaScript WebSocket 连接的封装与状态管理、Vue 3 中 WebSocket 的 Composable 封装(useWebSocket)、React 中自定义 Hook 管理连接生命周期、心跳检测(Ping/Pong 定时器)与自动断线重连的实现策略、指数退避重连算法、消息序列化协议(JSON / Protobuf / MessagePack)的选型与性

448

2026.05.25

WebSocket发送和接收数据教程合集
WebSocket发送和接收数据教程合集

本专题整合了WebSocket发送与接收数据教程合集,阅读专题下面的文章了解更多详细内容。

321

2026.05.25

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

40

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

40

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

20

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Qoder手册
Qoder手册

共0课时 | 0人学习

MySQL高级进阶视频教程
MySQL高级进阶视频教程

共38课时 | 14.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn