先实现TCP聊天服务器与客户端,通过goroutine处理并发连接,使用channel广播消息。服务器管理用户登录、消息转发和断开,客户端支持输入输出交互,可扩展私聊、历史记录等功能。

开发一个简单的聊天系统是学习Golang网络编程和并发处理的绝佳方式。通过这个项目,你可以掌握TCP通信、goroutine、channel等核心特性。下面是一个基础但完整的Golang简单聊天系统的实现思路与代码结构。
1. 项目目标
实现一个基于命令行的多人聊天系统,支持以下功能:
- 多个客户端可以连接到服务器
- 任意客户端发送的消息能广播给所有其他在线客户端
- 服务器能实时管理连接和断开的用户
- 支持用户名登录(可选)
2. 技术架构
采用C/S(客户端-服务器)模型,使用TCP协议进行通信。
- 服务器端:监听端口,接受多个客户端连接,使用goroutine处理每个连接,通过channel广播消息
- 客户端:连接服务器,发送和接收消息,支持本地输入输出
3. 服务器端实现
服务器主要职责是管理连接池、读取客户端消息并广播给其他人。
立即学习“go语言免费学习笔记(深入)”;
package mainimport ( "bufio" "fmt" "log" "net" )
type Client struct { conn net.Conn name string }
var ( clients = make(map[net.Conn]Client) broadcast = make(chan string) enter = make(chan Client) leave = make(chan *Client) )
func broadcaster() { for { select { case msg := <-broadcast: for conn := range clients { , err := fmt.Fprintln(conn, msg) if err != nil { log.Printf("广播错误: %v", err) leave <- clients[conn] } } case client := <-enter: clients[client.conn] = client broadcast <- fmt.Sprintf("[系统] %s 加入聊天", client.name) case client := <-leave: if , ok := clients[client.conn]; ok { close(client.conn) delete(clients, client.conn) broadcast <- fmt.Sprintf("[系统] %s 离开聊天", client.name) } } } }
func handleConn(conn net.Conn) { defer func() { if r := recover(); r != nil { log.Printf("连接处理异常: %v", r) } }()
fmt.Fprint(conn, "请输入你的用户名: ") reader := bufio.NewReader(conn) name, _ := reader.ReadString('\n') name = name[:len(name)-1] // 去除换行符 client := &Client{conn: conn, name: name} enter <- client go func() { for { msg, err := reader.ReadString('\n') if err != nil { leave <- client break } broadcast <- fmt.Sprintf("%s: %s", name, msg) } }() // 阻塞等待退出信号 select {}}
mallcloud商城下载mallcloud商城基于SpringBoot2.x、SpringCloud和SpringCloudAlibaba并采用前后端分离vue的企业级微服务敏捷开发系统架构。并引入组件化的思想实现高内聚低耦合,项目代码简洁注释丰富上手容易,适合学习和企业中使用。真正实现了基于RBAC、jwt和oauth2的无状态统一权限认证的解决方案,面向互联网设计同时适合B端和C端用户,支持CI/CD多环境部署,并提
func main() { listener, err := net.Listen("tcp", ":8080") if err != nil { log.Fatal(err) } defer listener.Close()
go broadcaster() fmt.Println("聊天服务器启动在 :8080...") for { conn, err := listener.Accept() if err != nil { log.Print(err) continue } go handleConn(conn) }}
4. 客户端实现
客户端负责连接服务器,发送用户输入,并持续接收服务器转发的消息。
package mainimport ( "bufio" "fmt" "log" "net" "os" )
func main() { conn, err := net.Dial("tcp", "localhost:8080") if err != nil { log.Fatal(err) } defer conn.Close()
go func() { scanner := bufio.NewScanner(conn) for scanner.Scan() { fmt.Println(scanner.Text()) } }() // 从标准输入读取并发送 input := bufio.NewScanner(os.Stdin) for input.Scan() { text := input.Text() + "\n" _, err := conn.Write([]byte(text)) if err != nil { log.Printf("发送失败: %v", err) break } }}
5. 运行方式
编译并运行:
- 先运行服务器:
go run server.go - 打开多个终端运行客户端:
go run client.go - 输入用户名后即可开始聊天
6. 扩展建议
可在基础版本上添加以下功能:
- 支持私聊(指定用户发送)
- 记录聊天历史
- 添加HTTP接口或WebSocket支持网页端
- 使用JSON格式传输消息
- 增加超时断线机制
基本上就这些。这个项目虽小,但涵盖了Golang中网络、并发、IO处理的核心知识点,适合初学者练手和进阶理解。










