Golang中如何实现多人聊天室?代码举例讲解

在Golang中,可以使用net包实现一个多人聊天室。代码示例:

go
// 客户端
type client struct {
    conn    net.Conn     // 连接
    name    string       // 用户名
}

// 客户端列表
var clients = make(map[net.Conn]*client)

// 广播消息到所有客户端
func broadcast(msg string) {
    for _, client := range clients {
        _, err := client.conn.Write([]byte(msg))
        if err != nil {
            // ...
        }
    } 
}

// 处理客户端连接
func handleConn(conn net.Conn) {
    // 读取客户端用户名
    msg := make([]byte, 512) 
    _, err := conn.Read(msg)

    // 将新的客户端添加到客户端列表
    clients[conn] = &client{
        conn: conn,
        name: string(msg),
    } 

    // 广播新加入信息
    broadcast(clients[conn].name + " joined the chat!\n")

    // 广播聊天信息
    go func() { 
        for {
            n, err := conn.Read(msg)
            if n == 0 || err != nil {
                // 客户端退出
                delete(clients, conn)
                broadcast(clients[conn].name + " left the chat.\n")
                return
            }
            // 广播消息
            broadcast(clients[conn].name + ": " + string(msg[:n]) + "\n")
        }
    }()
}

func main() {
    // 监听端口
    listener, err := net.Listen("tcp", ":8000")
    if err != nil {
        log.Fatal(err)
    }  

    // 处理客户端连接
    for { 
        conn, err := listener.Accept()
        if err != nil {
            log.Fatal(err)
        }
        go handleConn(conn)
    }
} 

这个聊天室会监听TCP端口,接收客户端连接并将其添加到clients列表。它会在一个goroutine中处理每个客户端,广播聊天消息和客户端加入/退出的信息。这个示例实现了一个简单的多人聊天室。