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中处理,确保服务器可以同时处理多个连接。

