答案:Go语言通过net包实现TCP通信,服务器用net.Listen监听并Accept接收连接,每个连接由goroutine处理;客户端通过net.Dial建立连接,利用bufio按行读写数据;需解决TCP粘包问题,常用换行符分隔消息;结合defer关闭连接、设置超时及合理错误处理可构建稳定并发的网络应用。

在Go语言中实现TCP客户端与服务器通信非常直观,得益于标准库net包的强大支持。通过简单的API调用,就能快速构建稳定、高效的网络应用。下面从基本结构出发,逐步讲解如何用Golang实现一个完整的TCP通信模型。
1. TCP服务器的基本实现
使用net.Listen函数监听指定地址和端口,等待客户端连接。一旦有连接到来,通过Accept接收并处理数据。
示例代码:
package mainimport ( "bufio" "fmt" "log" "net")func main() { // 监听本地9000端口 listener, err := net.Listen("tcp", ":9000") if err != nil { log.Fatal("监听失败:", err) } defer listener.Close() fmt.Println("服务器启动,等待连接...") for { // 接受客户端连接 conn, err := listener.Accept() if err != nil { log.Println("接受连接出错:", err) continue } // 启动协程处理每个连接 go handleConnection(conn) }}func handleConnection(conn net.Conn) { defer conn.Close() scanner := bufio.NewScanner(conn) for scanner.Scan() { message := scanner.Text() fmt.Printf("收到消息: %sn", message) // 回传响应 _, _ = conn.Write([]byte("已收到: " + message + "n")) }}
关键点说明:
立即学习“go语言免费学习笔记(深入)”;
使用net.Listen(“tcp”, “:9000”)开启监听 Accept阻塞等待新连接,每次返回一个新的net.Conn对象 每个连接交由独立的goroutine处理,实现并发通信
2. TCP客户端的实现方式
客户端通过net.Dial连接服务器,之后可发送和接收数据。
示例代码:
package mainimport ( "bufio" "fmt" "log" "net" "os")func main() { // 连接本地服务器 conn, err := net.Dial("tcp", "localhost:9000") 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() { line := input.Text() _, err := conn.Write([]byte(line + "n")) if err != nil { log.Println("发送失败:", err) return } }}
注意细节:
Dial成功后得到net.Conn,即可双向通信 使用另一个goroutine监听服务器返回的消息,避免阻塞输入 每条消息以换行符结尾,便于bufio.Scanner按行解析
3. 数据粘包问题与解决方案
TCP是流式协议,多次发送的数据可能被合并或拆分,导致“粘包”。常见解决方法包括:
添加消息边界:如每条消息以换行符结束(本例采用) 固定长度消息:每次读取固定字节数 自定义协议头:包含长度字段,先读长度再读内容
推荐使用encoding/gob或json序列化结构体,并配合长度前缀传输复杂数据。
4. 错误处理与连接关闭
实际项目中需关注以下情况:
连接中断时,Read会返回io.EOF,Write可能报broken pipe 合理设置超时时间,防止资源泄露 使用context控制协程生命周期 确保conn.Close被调用,释放文件描述符
可通过SetDeadline设置读写超时,提升服务健壮性。
基本上就这些。Golang的TCP编程简洁高效,配合goroutine天然适合高并发场景。只要掌握Listen、Dial、Conn读写和基础协议设计,就能构建实用的网络程序。
以上就是Golang如何实现TCP客户端与服务器_Golang TCP客户端服务器实践详解的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1424263.html
微信扫一扫
支付宝扫一扫