TCP聊天客户端需连接服务器、发送消息、接收消息;用net.Dial建立连接,两个goroutine分别处理标准输入发送和conn读取,bufio按行收发,net.Conn线程安全但需妥善处理错误与关闭。

理解TCP聊天客户端的基本结构
Go语言的net包提供了简洁稳定的TCP网络编程支持。一个典型的TCP聊天客户端需完成三件事:连接服务器、发送消息、接收消息。多客户端通信不是客户端自身实现“多对多”,而是多个独立客户端同时连接同一服务器,由服务器负责中转或广播消息。
编写基础客户端连接与收发逻辑
客户端启动后应先建立到服务器的TCP连接,之后启用两个goroutine:一个持续读取服务器发来的消息并打印;另一个监听标准输入(如os.Stdin),将用户输入发送给服务器。
- 使用
net.Dial("tcp", "localhost:8080")连接服务器(地址按实际调整) - 用
bufio.NewReader(os.Stdin)读取用户输入,避免阻塞主线程 - 用
conn.Write()发送消息,注意追加换行符(n)便于服务端按行解析 - 接收端用
bufio.NewReader(conn)配合ReadString('n')逐条读取消息
处理并发安全与连接异常
多个goroutine共享连接句柄时,无需额外加锁——net.Conn本身是线程安全的,但需注意关闭时机和错误响应。
- 在读/写goroutine中检测
io.EOF或其它错误,出错时调用conn.Close()并退出goroutine - 主函数可用
sync.WaitGroup等待两个goroutine结束,再退出程序 - 为提升体验,可在发送前检查连接是否活跃(例如尝试
conn.SetWriteDeadline配合小延迟写操作)
配合服务器实现多客户端可见性
客户端本身不感知其他客户端,所有“群聊”效果依赖服务器转发策略。例如服务器收到A的消息后,遍历当前所有活跃连接(排除A自身),逐个Write广播。因此开发客户端时需约定协议格式:
立即学习“go语言免费学习笔记(深入)”;
- 简单场景:纯文本,每行一条消息,服务器按行分割并广播
- 进阶场景:加入jsON格式,含
{"from":"user1","msg":"hello"}字段,便于前端展示来源 - 可选添加心跳机制:客户端定时发
PING,服务器响应PONG,超时则清理连接
不复杂但容易忽略的是日志与用户体验细节:比如连接成功后提示“已加入聊天室”,发送失败时给出明确错误(如“服务器断开,请重试”),而非静默崩溃。