答案:使用Go标准库net和sync实现并发安全的多用户聊天系统,通过TCP连接、goroutine处理读写、sync.RWMutex保护客户端map,支持消息广播、昵称设置与退出命令。
用 Go 实现一个简易多用户聊天系统,核心在于并发安全的连接管理、实时消息广播和轻量级协议设计。不需要复杂框架,标准库 net 和 sync 就够用。
Go 的 net.Listen 和 conn.Read/Write 足以支撑基础通信。每个客户端连接启动一个 goroutine 处理读写,避免阻塞其他用户。
:8080),Accept() 后为每个连接启动 handleConn()
net.Dial 连接,发送纯文本消息(如 "hello"),换行符 \n 作分隔fmt.Scanln 读输入——它会阻塞;改用 bufio.NewReader(os.Stdin).Read
String('\n')
不能直接用普通 map 存连接,因为多个 goroutine 并发读写会 panic。加读写锁是最简单可靠的方案。
var clients = make(map[*net.Conn]bool) + var mu sync.RWMutex
mu.Lock(); clients[&conn] = true; mu.Unlock()
mu.RLock(); defer mu.RUnlock(),遍历只读不修改广播不是“发一次给服务器,服务器转发”,而是服务端主动把消息 copy 到每个 client conn。关键点是处理写失败(如客户端已断开)。
conn.Write([]byte(msg))
io.EOF 或 broken pipe),说明连接已失效,应删掉该 conn 并关闭它[14:22:05][Alice] Hi there!
提升可用性的小技巧:让客户端能输入 /nick Bob 改名,/quit 退出,服务端识别并响应。
/ 开头/nick xxx → 更新该 conn 对应的用户名(可用另一个 map 记录 conn → name)/quit → 主动关闭 conn,清理 clients map,广播“xxx 下线了”"[Alice] hello"
基本上就这些。不依赖第三方库,百行左右代码就能跑通多用户实时聊天。重点是理解并发安全的共享状态管理,以及如何优雅处理连接生命周期。后续可扩展 JSON 消息、私聊、历史回溯,但底子要稳。