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


相关推荐
星光一影5 小时前
HIS系统天花板,十大核心模块,门诊/住院/医保全流程打通,医院数字化转型首选
java·spring boot·后端·sql·elementui·html·scss
CC.GG5 小时前
【C++】STL容器--list的使用
开发语言·c++·list
武子康5 小时前
大数据-126 - Flink一文搞懂有状态计算:State Backend 工作原理与性能差异详解 核心原理与作用
大数据·后端·flink
洲覆5 小时前
基于 clangd 搭建 Redis 6.2 源码阅读与调试环境
开发语言·数据库·redis·缓存
草莓熊Lotso6 小时前
《算法闯关指南:优选算法--二分查找》--19.x的平方根,20.搜索插入位置
java·开发语言·c++·算法
旭意6 小时前
C++蓝桥杯之函数与递归
开发语言·c++·蓝桥杯
。TAT。6 小时前
C++ - vector
开发语言·c++·学习
杨福瑞6 小时前
C语言数据结构:算法复杂度(1)
c语言·开发语言·数据结构
郭源潮16 小时前
《Muduo网络库:实现one loop per thread设计模式》
开发语言·c++·网络库
Zz_waiting.6 小时前
Spring Cloud 概述
后端·spring·spring cloud