目录

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

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

七、总结

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