首页 > 后端开发 > Golang > 正文

Golang如何实现WebSocket数据收发

P粉602998670
发布: 2025-10-15 10:28:01
原创
655人浏览过
Go语言通过gorilla/websocket库实现WebSocket通信,首先使用go get安装依赖,然后创建Upgrader实例将HTTP连接升级为WebSocket,示例代码展示了服务端接收并回显消息的过程,客户端可用JavaScript测试连接,关键点包括允许跨域、读写消息及连接关闭,适用于实时通信场景。

golang如何实现websocket数据收发

Go语言实现WebSocket通信主要依赖第三方库 gorilla/websocket,这是目前最常用且稳定的选择。下面介绍如何用Golang搭建一个简单的WebSocket服务端,完成数据的接收与发送。

1. 安装 gorilla/websocket

在项目中引入依赖:

go get github.com/gorilla/websocket

2. 创建WebSocket服务端

使用 gorilla/websocket 提供的 Upgrader 将HTTP连接升级为WebSocket连接。

示例代码:

PHP5 和 MySQL 圣经
PHP5 和 MySQL 圣经

本书是全面讲述PHP与MySQL的经典之作,书中不但全面介绍了两种技术的核心特性,还讲解了如何高效地结合这两种技术构建健壮的数据驱动的应用程序。本书涵盖了两种技术新版本中出现的最新特性,书中大量实际的示例和深入的分析均来自于作者在这方面多年的专业经验,可用于解决开发者在实际中所面临的各种挑战。

PHP5 和 MySQL 圣经 466
查看详情 PHP5 和 MySQL 圣经

立即学习go语言免费学习笔记(深入)”;

package main

import (
    "log"
    "net/http"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true // 允许跨域连接,生产环境应做更严格校验
    },
}

func wsHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Printf("升级失败: %v", err)
        return
    }
    defer conn.Close()

    // 循环读取消息
    for {
        msgType, message, err := conn.ReadMessage()
        if err != nil {
            log.Printf("读取失败: %v", err)
            break
        }

        log.Printf("收到消息: %s", message)

        // 回显消息
        if err := conn.WriteMessage(msgType, message); err != nil {
            log.Printf("发送失败: %v", err)
            break
        }
    }
}

func main() {
    http.HandleFunc("/ws", wsHandler)
    log.Println("服务器启动,地址: :8080")
    log.Fatal(http.ListenAndServe(":8080", nil))
}
登录后复制

3. 客户端测试(JavaScript)

可以用浏览器控制台测试连接:

const ws = new WebSocket("ws://localhost:8080/ws");
ws.onopen = () => {
    ws.send("你好,Golang WebSocket!");
};
ws.onmessage = (event) => {
    console.log("收到:", event.data);
};
ws.onclose = () => {
    console.log("连接关闭");
};
登录后复制

4. 关键点说明

  • Upgrader.CheckOrigin:默认拒绝跨域请求,开发时可设为true,上线前应限制合法来源。
  • ReadMessage():阻塞读取客户端消息,返回消息类型(text/binary)和内容。
  • WriteMessage():向客户端发送数据,保持与读取相同的消息类型更稳妥。
  • defer conn.Close():确保连接关闭,防止资源泄漏。

基本上就这些。通过 gorilla/websocket 可以轻松实现全双工通信,适合实时聊天、通知推送等场景。不复杂但容易忽略错误处理和连接管理,建议结合 context 或 hub 模式做更完善的控制。

以上就是Golang如何实现WebSocket数据收发的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号