如何在Golang中实现TCP客户端_连接服务器并发送请求

Go中实现TCP客户端需用net.Dial建立连接,通过conn读写数据;注意流式协议无消息边界、须处理超时与错误、显式关闭连接。

在 Go 语言中实现 TCP 客户端,核心是使用 net 包中的 net.Dial 建立连接,然后通过返回的 conn(实现了 io.ReadWriteCloser)发送和接收数据。整个过程简洁、阻塞式、易于控制。

建立 TCP 连接

调用 net.Dial("tcp", "host:port") 即可发起连接。Go 会自动解析域名、选择 IPv4/IPv6,并完成三次握手。如果连接失败(如服务器未启动、网络不通、端口被拒),会立即返回错误。

  • 地址格式必须是 "host:port",例如 "127.0.0.1:8080""example.com:9999"
  • 不支持只传主机名而不带端口;端口必须是字符串形式(不能是 int)
  • 建议设置超时,避免无限等待:用 net.DialTimeout("tcp", addr, 5*time.Second)

发送请求数据

连接成功后,conn 可直接写入字节。注意 TCP 是流式协议,没有消息边界——你写一次 Write,对方可能分多次 Read 到,或合并多次写入一起读到。

  • conn.Write([]byte("HELLO\n")) 发送原始字节
  • 若需发送结构化数据(如 JSON),先序列化再写入:json.NewEncoder(conn).Encode(req)
  • 常见做法是约定结尾符(如 \n)或长度前缀,方便服务端拆包

读取服务器响应

使用 conn.Read() 读取响应,它会阻塞直到有数据到达或连接关闭。由于不知道响应多长,通常需循环读取或配合缓冲区处理。

  • 简单场景可用 io.ReadAll(conn) 读完所有数据(直到 EOF 或错误)
  • 更稳妥的做法是预分配缓冲区,例如:buf := make([]byte, 1024); n, err := conn.Read(buf)
  • 若服务端按行响应,可用 bufio.NewReader(conn).ReadString('\n')

关闭连接与错误处理

TCP 连接用完必须显式关闭,否则会泄漏文件描述符。同时,所有 I/O 操作都应检查错误。

  • 务必在 defer 或函数末尾调用 conn.Close()
  • WriteRead 都可能返回 io.EOF(对端关闭连接)或其他网络错误
  • 不要忽略 err:哪怕只是打印日志,也比静默失败好

不复杂但容易忽略。写一个健壮的 TCP 客户端,关键不是语法,而是理解流式通信的边界问题和资源生命周期管理。