Python TCP通信详解:客户端与服务器实现及核心机制

拾柒
拾柒
发布时间:2026-10-13| 6人浏览过
原创

本文深入解析Python中TCP通信的实现原理与代码示例。详细对比TCP与UDP协议差异,阐述面向连接、可靠传输等特性。提供完整的Python TCP客户端与服务端代码,涵盖套接字创建、绑定、监听、连接及数据收发流程,并总结服务器开发中的关键注意事项,如端口绑定、主动/被动套接字区别及连接管理,帮助开发者快速掌握网络编程基础。

TCP简介

TCP介绍

传输控制协议(Transmission Control Protocol,简称TCP)是一种面向连接、可靠且基于字节流的传输层通信协议,其规范由IETF在RFC 793中定义。

TCP通信过程主要包含建立连接、数据传输以及终止连接这三个关键步骤。

在TCP通信模型中,通信开始前必须预先建立连接才能进行数据发送,这类似于现实生活中的“打电话”过程。

TCP特点

1. 面向连接

通信双方必须先建立连接才能传输数据,且双方都需要分配必要的系统内核资源,以管理连接状态及传输过程。

双方之间的所有数据传输均通过这一条已建立的连接进行。

数据交换完成后,双方必须断开连接以释放系统资源。

这种连接是一对一的,因此TCP不适用于广播场景,基于广播的应用程序应使用UDP协议。

2. 可靠传输

1)TCP采用发送应答机制

TCP发送的每个报文段都必须得到接收方的确认应答,才被视为传输成功。

2)超时重传

发送端在发出报文段后会启动定时器,若在设定时间内未收到应答,则重新发送该报文段。

为确保不丢包,TCP为每个数据包分配序号,同时保证接收端按序接收。接收端对成功收到的数据包发送确认(ACK);若发送端在合理的往返时延(RTT)内未收到确认,则假设数据包丢失并进行重传。

3)错误校验

TCP使用校验和函数来检测数据错误,发送和接收时均需计算校验和。

4) 流量控制和阻塞管理

流量控制用于防止主机发送速度过快,导致接收方无法及时接收数据。

TCP与UDP的不同点

  • 面向连接(确认有创建三方交握,连接已创建才作传输。)
  • 有序数据传输
  • 重发丢失的数据包
  • 舍弃重复的数据包
  • 无差错的数据传输
  • 阻塞/流量控制

udp通信模型

在UDP通信模型中,通信开始前无需建立连接,只需直接发送数据,这类似于现实生活中的“写信”。

tcp通信模型

在TCP通信模型中,通信开始前必须建立相关连接才能发送数据,这类似于现实生活中的“打电话”。

tcp客户端

TCP客户端的实现比服务器端简单得多。如果将服务器端比作需要购买手机、办理SIM卡、设置铃声并等待他人来电的过程,那么客户端只需寻找电话亭并拨打号码即可,流程相对简化。

Python创建TCP客户端的代码示例如下:

import socket


def main():
  # 1.创建套接字socket
  tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

  # 2.连接服务器
  dest_ip = input("请输入服务器ip:")
  dest_port = int(input("请输入服务器port:"))
  dest_addr = (dest_ip, dest_port)
  tcp_socket.connect(dest_addr)

  # 3. 接收/发送数据
  send_data = input("请输入要发送的数据:")
  tcp_socket.send(send_data.encode("utf-8")) 
 
  # 接收服务器发送的数据
  recv_data = tcp_socket.recv(1024)
  print(recv_data.decode("utf-8")) 

  # 4. 关闭套接字socket
  tcp_socket.close()

if __name__ == "__main__":

  main()

在Ubuntu终端上执行以下命令:

在网络调试助手中启动TCP服务器进行交互测试:

tcp服务器

在程序中实现TCP服务器功能,通常需要遵循以下流程:

  • 使用socket创建一个套接字
  • 绑定IP地址和端口号(bind)
  • 使套接字进入监听状态,以便接受被动链接(listen)
  • 等待并接收客户端的连接请求(accept)
  • 使用recv/send进行数据的接收和发送
import socket


def main():
  # 1.创建套接字
  tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
 
  # 2.绑定端口
  addr = ("", 8866)
  tcp_server_socket.bind(addr)

  # 3.监听链接
  tcp_server_socket.listen(128)

  # 4.接收别人的连接
  # client_socket用来为这个客户端服务
  client_socket, client_addr = tcp_server_socket.accept() 
 
  # 5.接收对方发送的数据
  recv_data = client_socket.recv(1024) 
  print("接收到的数据:%s" % recv_data.decode("utf-8"))
 
  # 6.给对方发送数据
  client_socket.send("hahaha".encode("utf-8")) 

  # 7.关闭套接字 
  client_socket.close()
  tcp_server_socket.close()


if __name__ == "__main__":
  main()

在Ubuntu终端上执行以下命令:

在网络调试助手中启动TCP服务器进行交互测试:


tcp注意点

  1. TCP服务器通常需要进行绑定,否则客户端无法找到该服务器。
  2. TCP客户端一般不进行绑定,因为它是主动链接服务器,只需确定服务器的IP和端口即可,本地客户端的端口可以随机分配。
  3. 在TCP服务器中,通过listen将创建出的主动套接字转变为被动套接字,这是构建TCP服务器必须的步骤。
  4. 当客户端需要链接服务器时,需使用connect进行链接。UDP无需链接即可直接发送,但TCP必须先链接成功才能通信。
  5. 当一个TCP客户端连接服务器时,服务器端会生成一个新的套接字,该套接字用于标识此特定客户端,并单独为其提供服务。
  6. listen后的套接字是被动套接字,用于接收新客户端的连接请求;而accept返回的新套接字则用于标识这个新连接的客户端。
  7. 关闭listen后的套接字意味着被动套接字关闭,这将导致新的客户端无法链接服务器,但之前已成功链接的客户端仍可正常通信。
  8. 关闭accept返回的套接字意味着该客户端的服务结束。
  9. 当客户端套接字调用close后,服务器端的recv操作会解除阻塞,并返回长度为0。因此,服务器可以通过返回数据的长度来判断客户端是否已下线。

总结

以上就是本文的全部内容,希望这些内容对您的学习或工作具有参考价值。如有任何疑问,欢迎留言交流,感谢大家对本站的支持。

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

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 算法库。