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


相关推荐
ZNineSun2 小时前
第二章:Java到Go的思维转变
java·golang
数据知道2 小时前
Go基础:Go语言中的指针详解:在什么情况下应该使用指针?
开发语言·后端·golang·指针·go语言
10001hours2 小时前
C语言第19讲
c语言·开发语言
我是前端小学生2 小时前
Poetry:Python 开发者的依赖管理与项目利器
后端·python
华仔啊2 小时前
SpringBoot 中的 7 种耗时统计方式,你用过几种?
java·后端
yeyong3 小时前
如何找到一个陌生服务器上的grafana-server是谁启动的
后端
小蒜学长3 小时前
springboot宠物领养救助平台的开发与设计(代码+数据库+LW)
java·数据库·spring boot·后端·宠物
武子康3 小时前
大数据-106 Spark Graph X案例:1图计算、2连通图算法、3寻找相同用户 高效分区、负载均衡与迭代优化
大数据·后端·spark
小羊在睡觉3 小时前
Go语言爬虫:爬虫入门
数据库·后端·爬虫·golang·go