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

如何在Golang中使用WebSocket_Golang WebSocket实时通信方法

P粉602998670
发布: 2025-11-23 18:05:02
原创
416人浏览过
使用gorilla/websocket库实现Golang WebSocket通信:1. 安装库并创建HTTP处理器升级连接;2. 服务端通过Upgrader升级HTTP请求,收发消息;3. 前端或Go客户端连接服务端并交互;4. 用map和互斥锁管理多个连接,实现广播。

如何在golang中使用websocket_golang websocket实时通信方法

在Golang中实现WebSocket实时通信,关键在于使用成熟的库(如gorilla/websocket)建立连接,并处理客户端与服务端之间的双向数据传输。整个过程包括升级HTTP连接、维护连接状态和收发消息。

1. 安装WebSocket库

Go语言标准库不包含原生WebSocket支持,推荐使用社区广泛使用的gorilla/websocket

go get github.com/gorilla/websocket

2. 编写WebSocket服务端

创建一个HTTP处理器,将客户端的HTTP请求升级为WebSocket连接:

示例代码:
定义一个处理函数用于升级连接并读取消息:

package main

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

var upgrader = websocket.Upgrader{
  CheckOrigin: func(r *http.Request) bool { return true }, // 允许跨域
}

func echoHandler(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, msg, err := conn.ReadMessage()
    if err != nil {
      log.Printf("读取消息失败: %v", err)
      break
    }
    log.Printf("收到: %s", msg)
    // 回显消息
    conn.WriteMessage(msgType, msg)
  }
}

func main() {
  http.HandleFunc("/ws", echoHandler)
  log.Println("服务启动于 :8080")
  log.Fatal(http.ListenAndServe(":8080", nil))
}

3. 实现客户端连接

前端可用JavaScript原生WebSocket API连接Go服务端:

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

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版
动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版

动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包

动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版 508
查看详情 动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版
const ws = new WebSocket("ws://localhost:8080/ws");

ws.onopen = () => {
  console.log("已连接");
  ws.send("Hello, Golang!");
};

ws.onmessage = (event) => {
  console.log("收到:", event.data);
};

ws.onclose = () => {
  console.log("连接关闭");
};

你也可以用Go编写客户端进行测试:

conn, _, err := websocket.DefaultDialer.Dial("ws://localhost:8080/ws", nil)
if err != nil { /* 处理错误 */ }
defer conn.Close()

conn.WriteMessage(websocket.TextMessage, []byte("来自Go客户端"))
, msg, := conn.ReadMessage()
fmt.Printf("响应: %s", msg)

4. 管理多个连接与广播消息

实际应用中常需向多个客户端广播消息。可通过维护连接池实现:

使用map和互斥锁保存所有活跃连接:

var clients = make(map[*websocket.Conn]bool)
var broadcast = make(chan []byte)
var mutex = sync.Mutex{}

// 在echoHandler中注册连接
mutex.Lock()
clients[conn] = true
mutex.Unlock()

// 单独goroutine广播消息
for {
  msg := <-broadcast
  mutex.Lock()
  for client := range clients {
    err := client.WriteMessage(websocket.TextMessage, msg)
    if err != nil {
      client.Close()
      delete(clients, client)
    }
  }
  mutex.Unlock()
}

当某个客户端断开时,在读循环中删除其连接记录即可。

基本上就这些。搭建一个基础的Golang WebSocket服务并不复杂,关键是理解连接升级机制和并发处理模式。生产环境还需加入心跳检测、认证授权和错误重连等机制。

以上就是如何在Golang中使用WebSocket_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号