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

Golang实现简单聊天室WebSocket服务

P粉602998670
发布: 2025-09-29 12:12:02
原创
492人浏览过
答案:使用Golang和gorilla/websocket库可实现一个简单的WebSocket聊天室,通过HTTP服务升级连接、管理客户端并广播消息。首先安装gorilla/websocket库,创建/ws路由并用Upgrader升级为WebSocket连接,允许跨域;接着定义clients映射和broadcast通道,用RWMutex保证并发安全,在wsHandler中注册连接并读取消息发送至广播通道;然后在main函数中启动handleBroadcast协程,循环监听broadcast并将消息写入所有活跃连接,出错时关闭连接并从clients中删除;最后编写HTML页面测试,多个浏览器窗口可实时收发消息,完成基础聊天功能。

golang实现简单聊天室websocket服务

用Golang实现一个简单的WebSocket聊天室服务,核心在于使用gorilla/websocket库建立长连接,并通过广播机制让所有客户端实时收发消息。整个服务不需要前端框架,后端即可完成连接管理与消息分发。

1. 安装依赖并初始化WebSocket服务

Go语言中操作WebSocket最常用的库是gorilla/websocket。先通过以下命令安装:

go get github.com/gorilla/websocket

然后创建一个HTTP服务,将特定路径(如/ws)升级为WebSocket连接:

代码示例:
创建main.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()
  log.Println("新客户端已连接")

  // 简单回显测试
  for {
    _, msg, err := conn.ReadMessage()
    if err != nil {
      log.Printf("读取消息错误: %v", err)
      break
    }
    log.Printf("收到消息: %s", msg)
    conn.WriteMessage(websocket.TextMessage, []byte("echo: "+string(msg)))
  }
}

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

2. 实现客户端连接管理

聊天室需要维护多个客户端连接。可以定义一个Client结构体和一个全局的clients集合来管理活跃连接。

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

使用map[*websocket.Conn]bool存储连接,并用互斥锁保护并发安全。

极简智能王
极简智能王

极简智能- 智能聊天AI绘画,还可以创作、编写、翻译、写代码等多种功能,满足用户生活和工作的多方面需求

极简智能王 33
查看详情 极简智能王
var (
  clients = make(map[*websocket.Conn]bool)
  broadcast = make(chan Message)
  mu sync.RWMutex
)

type Message struct {
  Data string json:"data"
}

wsHandler中注册新连接,并将其加入clients

func wsHandler(w http.ResponseWriter, r *http.Request) {
  conn, err := upgrader.Upgrade(w, r, nil)
  if err != nil {
    return
  }
  defer conn.Close()

  mu.Lock()
  clients[conn] = true
  mu.Unlock()

  for {
    _, msg, err := conn.ReadMessage()
    if err != nil {
      break
    }
    broadcast <- Message{Data: string(msg)}
  }

  mu.Lock()
  delete(clients, conn)
  mu.Unlock()
}

3. 广播消息给所有在线用户

启动一个独立的广播协程,在main函数中监听broadcast通道,把接收到的消息发送给每一个当前连接的客户端。

func main() {
  http.HandleFunc("/ws", wsHandler)
  go handleBroadcast()
  log.Println("聊天室服务运行在 :8080")
  log.Fatal(http.ListenAndServe(":8080", nil))
}

func handleBroadcast() {
  for {
    msg := <-broadcast
    data := []byte(msg.Data)
    mu.RLock()
    for conn := range clients {
      err := conn.WriteMessage(websocket.TextMessage, data)
      if err != nil {
        log.Printf("发送失败: %v", err)
        conn.Close()
        mu.Lock()
        delete(clients, conn)
        mu.Unlock()
      }
    }
    mu.RUnlock()
  }
}

4. 测试聊天室功能

写一个简单的HTML页面测试聊天功能:

<!DOCTYPE html>
<html>
<body>
<input type="text" id="msg" />
<button onclick="send()">发送</button>
<ul id="logs"></ul>
<script>
  const ws = new WebSocket("ws://localhost:8080/ws");
  ws.onmessage = function(event) {
    const li = document.createElement("li");
    li.textContent = event.data;
    document.getElementById("logs").appendChild(li);
  };
  function send() {
    const input = document.getElementById("msg");
    ws.send(input.value);
    input.value = "";
  }
</script>
</body>
</html>

打开多个浏览器窗口,输入消息点击发送,所有客户端都能实时看到内容。

基本上就这些。这个简单聊天室实现了连接管理、消息广播和基础异常处理,适合学习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号