Golang中如何处理这种网络服务器的广播消息?

Golang中如何处理这种网络服务器的广播消息? 大家好,我刚开始学习Go语言,并四处寻找如何创建一个简单的TCP服务器的示例。于是我尝试了一下,写出了下面这段代码。

package main

import (
    "bufio"
    "fmt"
    "net"
)

func handleConnection(c net.Conn) {
    // 处理连接
}

基本上,客户端可以发送“message:string1”,服务器会将其返回给该客户端。但如果客户端发送的是“brc:string1”,服务器应该将该string1也发送给所有其他客户端。我在这里遇到了困难,不知道该如何实现。任何形式的帮助都将非常棒。

谢谢大家,祝你们有美好的一天!


更多关于Golang中如何处理这种网络服务器的广播消息?的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中如何处理这种网络服务器的广播消息?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


要实现广播功能,你需要维护一个所有连接的列表,并在收到广播消息时遍历这个列表发送消息。下面是一个完整的示例:

package main

import (
    "bufio"
    "fmt"
    "net"
    "strings"
    "sync"
)

type Client struct {
    conn net.Conn
    name string
}

var (
    clients   = make(map[*Client]bool)
    clientsMu sync.RWMutex
)

func broadcast(message string, sender *Client) {
    clientsMu.RLock()
    defer clientsMu.RUnlock()
    
    for client := range clients {
        if client != sender {
            fmt.Fprintf(client.conn, "广播消息: %s\n", message)
        }
    }
}

func handleConnection(conn net.Conn) {
    defer conn.Close()
    
    client := &Client{conn: conn}
    
    // 添加客户端到列表
    clientsMu.Lock()
    clients[client] = true
    clientsMu.Unlock()
    
    // 连接断开时移除
    defer func() {
        clientsMu.Lock()
        delete(clients, client)
        clientsMu.Unlock()
    }()
    
    scanner := bufio.NewScanner(conn)
    for scanner.Scan() {
        text := scanner.Text()
        
        if strings.HasPrefix(text, "brc:") {
            // 广播消息
            message := strings.TrimPrefix(text, "brc:")
            broadcast(message, client)
            fmt.Fprintf(conn, "已广播: %s\n", message)
        } else if strings.HasPrefix(text, "message:") {
            // 回显消息
            message := strings.TrimPrefix(text, "message:")
            fmt.Fprintf(conn, "回显: %s\n", message)
        } else {
            fmt.Fprintf(conn, "未知命令\n")
        }
    }
}

func main() {
    listener, err := net.Listen("tcp", ":8080")
    if err != nil {
        fmt.Println("监听失败:", err)
        return
    }
    defer listener.Close()
    
    fmt.Println("服务器启动,监听端口 8080")
    
    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("接受连接失败:", err)
            continue
        }
        go handleConnection(conn)
    }
}

这个实现使用了sync.RWMutex来安全地管理客户端连接映射。当客户端发送brc:开头的消息时,服务器会调用broadcast函数将消息发送给所有其他客户端。每个客户端连接都在独立的goroutine中处理,确保服务器可以同时处理多个连接。

回到顶部