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 高并发处理模型,为后续开发更复杂的实时应用打下基础。


相关推荐
松☆34 分钟前
Dart 核心语法精讲:从空安全到流程控制(3)
android·java·开发语言
编码者卢布1 小时前
【Azure Storage Account】Azure Table Storage 跨区批量迁移方案
后端·python·flask
编码者卢布1 小时前
【App Service】Java应用上传文件功能部署在App Service Windows上报错 413 Payload Too Large
java·开发语言·windows
kaikaile19951 小时前
结构风荷载理论与Matlab计算
开发语言·matlab
切糕师学AI1 小时前
ARM 汇编器中的伪指令(Assembler Directives)
开发语言·arm开发·c#
吕司2 小时前
Qt的信号与槽
开发语言·qt
bjxiaxueliang2 小时前
一文掌握C/C++命名规范:风格、规则与实践详解
c语言·开发语言·c++
玄〤3 小时前
Java 大数据量输入输出优化方案详解:从 Scanner 到手写快读(含漫画解析)
java·开发语言·笔记·算法
NBhhbYyOljP3 小时前
LabVIEW与西门子PLC S7200SMART 12001500 300 400
golang
一起养小猫3 小时前
Flutter for OpenHarmony 实战:番茄钟应用完整开发指南
开发语言·jvm·数据库·flutter·信息可视化·harmonyos