Go语言实现TCP服务端与客户端通信完整示例

Ada
Ada
发布时间:2026-10-15| 6人浏览过
原创

本文通过Go语言的net包演示如何构建一个基本的TCP服务端与客户端,详细说明了建立监听、接受连接、读写数据以及处理连接的完整流程与注意事项。

TCP协议核心机制简述

在编写代码前,理解TCP(Transmission Control Protocol)的基本特性有助于把握程序行为。TCP位于OSI模型的传输层,是一种面向连接的可靠传输协议。

可靠性与三次握手

TCP通过“三次握手”确保双方具备通信能力,并通过序列号、确认应答(ACK)及重传机制保证数据的有序性与完整性。建立连接时:

  • SYN(同步): 客户端发送初始序列号请求建立连接。
  • SYN-ACK(同步-确认): 服务端回应自己的初始序列号并确认客户端的请求。
  • ACK(确认): 客户端最后确认,完成连接建立。

连接释放与四次挥手

断开连接时通常采用“四次挥手”。由于TCP是全双工的,任何一方都可以发起关闭。服务端进入CLOSE_WAIT状态后需等待应用层处理完剩余数据,随后发送FIN报文;客户端接收后进行最终的ACK确认,经过TIME-WAIT状态后才彻底关闭连接。

Go语言服务端实现方案

服务端的核心任务是持续监听指定端口,并接受来自客户端的连接请求。主要涉及net.Listen、Accept和Close三个操作。

关键步骤解析

第1步:初始化TCP监听器

使用net.Listen("tcp", ":Port")创建监听通道。建议绑定特定IP地址与端口以明确监听范围。

第2步:循环接受新连接

调用listen.Accept()阻塞当前协程,直到有新客户端连接。每次接受成功后,应开启一个新的goroutine处理该连接,以防主循环被长期占用导致无法响应后续请求。

第3步:优雅关闭资源

在建立连接后立即执行defer listen.Close()。需注意必须在err检查之后调用,否则若启动失败,listen对象为空会导致defer触发空指针异常或无效操作。

Go语言客户端实现方案

客户端负责主动发起连接,并向服务器发送数据。完成后通常立即断开连接。

关键步骤解析

第1步:发起网络连接

使用net.Dial("tcp", ":Port")指定目标地址。此操作会尝试完成TCP三次握手,成功则返回有效连接对象,失败则返回错误。

第2步:数据发送

将字符串转换为字节切片([]byte),利用连接对象的Write方法发送给服务端。

第3步:连接清理

使用defer conn.Close()确保程序退出前释放系统资源。

完整可运行代码

服务端代码 (Server)

该代码启动服务端监听,并在收到消息后打印至控制台。为简化起见,服务端对每个客户端仅处理一次读取即结束。

package main
import (
	"fmt"
	"net"
)

// handle 用于处理单个客户端连接
func handle(conn net.Conn) {
	defer conn.Close()
	var info [256]byte // 缓冲区,限制单次读取大小
	n, err := conn.Read(info[:])
	if err != nil {
		fmt.Println("conn Read fail, err = ", err)
		return
	}
	fmt.Printf("Client sent: %s\n", string(info[:n]))
}

func main() {
	// 1. 建立 TCP 监听通道
	listen, err := net.Listen("tcp", "127.0.0.1:4399")
	if err != nil {
		panic(err)
	}
	// 必须在错误检查后设置 defer,防止 panic(err) 后执行 defer 导致崩溃
	defer listen.Close()
	fmt.Println("Server is listening on port 4399...")

	// 2. 永久循环,监听并接受连接
	for {
		conn, err := listen.Accept()
		if err != nil {
			fmt.Println("Accept error:", err)
			continue
		}
		// 3. 为新连接开启 goroutine,互不干扰
		go handle(conn)
	}
}

客户端代码 (Client)

该代码连接服务端,发送一条固定消息后自动退出。

package main
import (
	"fmt"
	"net"
)

func main() {
	// 1. 建立连接
	conn, err := net.Dial("tcp", "127.0.0.1:4399")
	if err != nil {
		fmt.Println("Connect failed, err:", err)
		return
	}
	defer conn.Close()

	// 2. 定义并发送消息
	msg := "Hi, I am a client from Go"
	_, err = conn.Write([]byte(msg))
	if err != nil {
		fmt.Println("Write failed, err:", err)
	} else {
		fmt.Println("Message sent successfully.")
	}
}

总结与常见问题排查

上述示例涵盖了Go中最基础的TCP网络编程模型。在实际开发中,建议注意以下几点:

  1. 超时控制:生产环境应设置连接的Read/Write超时时间,防止恶意连接占用资源(conn.SetReadDeadline)。
  2. 粘包与半包:TCP是流式协议,连续Write可能导致数据粘连。实际业务需设计头部长度或分隔符来解析数据边界。
  3. 异常处理:如上文所述,defer必须放置在对象正确初始化且无错误返回的逻辑之后。
以上就是Go语言实现简单TCP数据传输的详细内容,更多关于Go网络编程的资料请关注本站其它相关文章!
相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。