使用Golang的net包实现TCP聊天室需监听端口、管理连接、广播消息;2. 每个客户端连接由独立goroutine处理,通过channel广播消息;3. clients map用sync.Mutex保护,确保并发安全;4. handleBroadcast持续监听broadcast channel,将消息发送给所有在线客户端。

要使用Golang的
net包实现一个支持多用户的TCP聊天室服务器,核心在于监听客户端连接、管理多个连接、广播消息。Golang的并发模型(goroutine + channel)非常适合这类网络服务。下面是一个简洁但完整的实现思路和代码示例。
1. 基本架构设计
服务器需要做几件事:
- 监听TCP端口,接受客户端连接
- 为每个连接启动一个goroutine处理读写
- 维护所有活跃的客户端连接
- 当某个客户端发送消息时,广播给其他所有客户端
2. 客户端连接管理
使用一个
map来保存所有连接,并用
channel进行消息广播。由于
map不是并发安全的,需要用
sync.Mutex保护。 示例代码:
package mainimport ( "bufio" "fmt" "net" "strings" "sync" )
type Client struct { conn net.Conn name string }
var ( clients = make(map[net.Conn]*Client) mu sync.Mutex broadcast = make(chan string) )
3. 广播消息处理
启动一个独立的goroutine监听广播channel,并将消息发送给所有客户端。
立即学习“go语言免费学习笔记(深入)”;
func handleBroadcast() {
for {
msg := <-broadcast
mu.Lock()
for _, client := range clients {
go func(c *Client) {
_, _ = c.conn.Write([]byte(msg + "\n"))
}(client)
}
mu.Unlock()
}
}
4. 处理单个客户端
每个客户端连接启动一个goroutine,读取输入并发送到广播channel。首次输入作为用户名。
func handleClient(conn net.Conn) {
defer conn.Close()
scanner := bufio.NewScanner(conn)
// 第一条消息作为用户名
if !scanner.Scan() {
return
}
username := strings.TrimSpace(scanner.Text())
if username == "" {
username = conn.RemoteAddr().String()
}
mu.Lock()
clients[conn] = &Client{conn: conn, name: username}
mu.Unlock()
// 通知所有人有新用户加入
broadcast <- fmt.Sprintf("[系统] %s 加入了聊天室", username)
// 读取消息并广播
for scanner.Scan() {
text := strings.TrimSpace(scanner.Text())
if text == "" {
continue
}
broadcast <- fmt.Sprintf("%s: %s", username, text)
}
// 用户离开
mu.Lock()
delete(clients, conn)
mu.Unlock()
broadcast <- fmt.Sprintf("[系统] %s 离开了聊天室", username)
}
5. 启动服务器
主函数中监听端口,接受连接,并启动广播处理器。
func main() {
listener, err := net.Listen("tcp", ":8080")
if err != nil {
panic(err)
}
defer listener.Close()
fmt.Println("聊天服务器启动,监听 :8080")
// 启动广播goroutine
go handleBroadcast()
for {
conn, err := listener.Accept()
if err != nil {
continue
}
go handleClient(conn)
}
}
运行这个程序后,可以用
telnet localhost 8080
测试多个客户端连接。第一个输入是用户名,之后输入的内容会广播给所有人。
基本上就这些。不复杂但容易忽略细节,比如连接关闭时的资源清理、并发安全、空消息处理等。这个版本已经具备基础功能,可在此基础上扩展私聊、房间、命令等功能。










