Go语言实战案例-项目实战篇:编写一个轻量级在线聊天室

在现代互联网应用中,聊天室是一个经典的实时通信场景。Go 语言凭借其 高并发简洁语法,非常适合开发实时网络应用。本文将带你从零实现一个轻量级在线聊天室,支持多人消息广播。


一、项目目标

    1. 使用 WebSocket 实现实时通信。
    1. 客户端连接后,可以发送和接收消息。
    1. 服务端负责广播消息给所有在线用户。
    1. 提供简单的 Web 前端页面作为聊天室入口。

二、技术选型

  • 后端 :Go + gorilla/websocket(WebSocket 库)
  • 前端:HTML + JavaScript(原生 WebSocket API)
  • 运行环境:只需一个 Go 程序和浏览器

三、后端实现

1. 安装依赖

复制代码
go get github.com/gorilla/websocket

2. Go 服务端代码

复制代码
package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/gorilla/websocket"
)

// 升级器:将 HTTP 协议升级为 WebSocket
var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool {
        return true // 允许跨域
    },
}

// 全局客户端集合
var clients = make(map[*websocket.Conn]bool)

// 广播通道
var broadcast = make(chan string)

// 处理 WebSocket 连接
func handleConnections(w http.ResponseWriter, r *http.Request) {
    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Fatal(err)
    }
    defer ws.Close()

    // 新客户端加入
    clients[ws] = true

    for {
        var msg string
        err := ws.ReadJSON(&msg)
        if err != nil {
            delete(clients, ws)
            break
        }
        // 将消息发送到广播通道
        broadcast <- msg
    }
}

// 处理广播
func handleMessages() {
    for {
        // 等待新消息
        msg := <-broadcast
        // 将消息发送给所有客户端
        for client := range clients {
            err := client.WriteJSON(msg)
            if err != nil {
                client.Close()
                delete(clients, client)
            }
        }
    }
}

func main() {
    fs := http.FileServer(http.Dir("./static"))
    http.Handle("/", fs)
    http.HandleFunc("/ws", handleConnections)

    go handleMessages()

    fmt.Println("聊天室服务已启动:http://localhost:8080")
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("启动失败:", err)
    }
}

四、前端实现

新建 static/index.html

复制代码
<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8">
  <title>Go聊天室</title>
  <style>
    body { font-family: Arial; margin: 20px; }
    #chat { width: 400px; height: 300px; border: 1px solid #ccc; overflow-y: auto; padding: 10px; }
    #msg { width: 300px; }
  </style>
</head>
<body>
  <h2>Go 在线聊天室</h2>
  <div id="chat"></div>
  <input type="text" id="msg" placeholder="输入消息..." />
  <button onclick="sendMessage()">发送</button>

  <script>
    const ws = new WebSocket("ws://localhost:8080/ws");
    const chat = document.getElementById("chat");
    const msgInput = document.getElementById("msg");

    ws.onmessage = function(event) {
      const p = document.createElement("p");
      p.innerText = event.data;
      chat.appendChild(p);
      chat.scrollTop = chat.scrollHeight;
    };

    function sendMessage() {
      const msg = msgInput.value;
      ws.send(JSON.stringify(msg));
      msgInput.value = "";
    }
  </script>
</body>
</html>

五、运行效果

    1. 启动服务端:

      go run main.go

    1. 浏览器打开 http://localhost:8080
    1. 打开多个浏览器窗口,输入消息即可实时显示在所有窗口中。

六、功能扩展

    1. 用户昵称 :为每个用户分配昵称,显示 昵称: 消息
    1. 消息持久化:将聊天记录存储到数据库或文件中。
    1. 群聊/私聊:支持不同的房间或用户之间的私聊。
    1. Web UI 优化:使用 Vue/React 等框架美化界面。

七、总结

本文实现了一个轻量级的在线聊天室,利用 Go 的并发特性和 WebSocket 协议,完成了多人实时通信。通过本项目,你可以快速理解 WebSocket 工作原理Go 高并发处理模型,为后续开发更复杂的实时应用打下基础。


相关推荐
luj_17682 小时前
残熵算法实时化三大瓶颈突破
c语言·开发语言·网络·经验分享·算法
不听话坏3 小时前
Ignition篇(下 一) 动态执行前的事情
开发语言·前端·javascript
mCell3 小时前
你以为短链接只是 Hash + 301/302?
后端·算法·架构
likeyi073 小时前
require 和 import的区别
开发语言·前端
咖啡八杯3 小时前
GoF设计模式——迭代器模式
java·后端·设计模式·迭代器模式
远离UE43 小时前
UE5 compute shader 原子加
开发语言·c++·ue5
C+-C资深大佬3 小时前
C++ 显式类型转换详解:static_cast、dynamic_cast、const_cast、reinterpret_cast
开发语言·c++
KaMeidebaby4 小时前
卡梅德生物技术快报|抗体亲和力成熟工业化调控新机制:差异性浆细胞增殖工艺优化思路
java·开发语言·人工智能·算法·机器学习·架构·spark
luj_17685 小时前
心形曲线轨迹控制三大关键技术
c语言·开发语言·c++·经验分享·算法
Mininglamp_27185 小时前
Claude Code 封禁中国开发者之后:本地 AI 编程工具的替代方案实测
开发语言·人工智能·windows·开源软件·ai-native