Python TCP编程详解:从原理到代码实现

程一诺
程一诺
发布时间:2026-10-14| 3人浏览过
原创

本文详解Python中TCP网络编程的核心原理与实现方法。通过快递寄送的通俗比喻解释Socket、IP与端口概念,梳理TCP连接建立与关闭的标准流程。提供完整的Python代码示例,展示如何创建Socket、绑定端口、监听连接以及使用多线程处理并发请求,帮助开发者快速掌握基于Python的TCP通信开发技巧。

Python TCP编程概述

网络连接与通信是掌握任何编程语言的关键环节,Python自然也不例外。本文将深入探讨因特网的核心传输协议TCP,并演示如何利用Python实现TCP连接的建立与数据通信。

TCP协议与Socket基础

TCP协议概述

TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的传输层通信标准,旨在提供高可靠性的数据传输服务。许多常见的网络服务如HTTP和HTTPS均基于TCP协议进行通信。在网络编程领域,无论是实现TCP还是其他协议,都离不开对Socket(套接字)的使用。

Network Socket(网络套接字)

首先明确其定义:

Network Socket是计算机网络中进程间通信的数据流端点,从广义上讲,它也是操作系统提供的一种进程间通信机制。

这些专业术语往往显得晦涩难懂,虽然每个字都认识,但组合在一起却难以直观理解。我们可以用“寄送快递”来通俗类比:假设A要给B寄快递,A首先需要知道B的具体地址和手机号码。这里的“地址”对应网络中的主机IP地址,“手机号码”对应主机的端口号。此外,A还需选择快递公司(如顺丰或中通),这相当于通信所采用的传输协议。

TCP连接建立与关闭流程

TCP连接流程解析

在上述快递类比中,寄件人相当于客户端,收件人相当于服务器。在专业术语中,主动发起连接请求的一方称为客户端,被动响应并处理请求的一方称为服务器。例如,当我们在浏览器中访问百度搜索时,本地电脑作为客户端向百度的服务器发起连接请求;一旦服务器接受该请求,TCP连接即告建立,随后服务器将搜索结果传输给客户端。

参考以下流程图以直观理解:

TCP服务器的建立过程可归纳为以下步骤:

  • 创建socket(套接字)
  • 绑定socket的IP地址和端口号
  • 监听客户端的连接请求
  • 接受客户端的连接请求
  • 与客户端进行数据交互
  • 关闭连接

TCP客户端的创建步骤如下:

  • 创建socket(套接字)
  • 连接服务器socket
  • 与服务器进行数据交互
  • 关闭连接

需要注意的是,TCP客户端连接时指定的IP和端口号必须与TCP服务器绑定的IP及监听端口完全一致。服务器调用listen()方法开始监听端口后,会调用accept()方法持续等待客户端连接。此时服务器处于阻塞状态,直到接收到客户端请求并完成握手建立连接为止。

TCP客户端代码实现

TCP客户端实现

创建socket连接的具体做法如下:


# 导入socket库
import socket

# 创建一个socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 建立连接
s.connect(("127.0.0.1", 6000))

在创建socket时,第一个参数socket.AF_INET表示指定使用IPv4协议;若需使用IPv6协议,则应指定为socket.AF_INET6。参数SOCK_STREAM表示使用面向流的TCP协议。随后调用connect()方法,传入目标IP地址(或域名)及端口号即可建立连接。

连接建立后,即可向服务器发送数据:


s.send(b'Hello, Mr Right!')

接收数据时,需调用recv(max)方法,该方法一次最多接收指定的字节数。因此,通常在一个while循环中反复调用recv(),直到其返回空数据,表明接收完毕,此时退出循环。


# 接收数据
buffer = []
while True:
  # 每次最多接收1k字节
  d = s.recv(1024)
  if d:
    buffer.append(d)
  else:
    break
data = b''.join(buffer)

最后,需要关闭连接,操作十分简单:


s.close()

TCP服务器与多线程处理

TCP服务器实现

相较于客户端,服务器端的逻辑稍显复杂。服务器需要先绑定一个IP地址和端口号,然后监听客户端请求。一旦收到请求,通常将其分配到一个独立的线程中进行处理,以实现并发支持。

创建socket的方法与客户端相同:


s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

接下来,需要绑定监听地址和端口:


s.bind(('127.0.0.1', 6000))

随后即可开始监听端口。监听时需传入一个参数,用于指定等待连接的最大队列数量:


s.listen(5)

接下来进入无限循环,等待客户端连接。一旦有连接请求到来,便创建一个新线程来处理该连接:


while True:
  # 接受一个新连接
  sock, addr = s.accept()
  # 创建新线程来处理TCP连接
  t = threading.Thread(target=tcplink, args=(sock, addr))
  t.start()

这里为何需要多线程处理?可以想象菜鸟驿站:如果只有一名工作人员,多个用户寄件必须排队依次处理;但如果有多名工作人员,每个人可以独立处理一个寄件请求,从而提升效率。

以下是处理客户端请求的具体方法示例:


# 处理tcp连接
def tcplink(conn, addr):
  print("Accept new connection from %s:%s" % addr)
  # 向客户端发送欢迎消息
  conn.send(b"Server: Welcome!\n")
  while True:
    conn.send(b"Server: What's your name?")

    data = conn.recv(1024)
    # 如果客户端发送 exit 过来请求退出,结束循环
    if data == b"exit":
      conn.send(b"Server: Good bye!\n")
      break
    conn.send(b"Server: Hello %s!\n" % data)

  # 关闭连接
  conn.close()
  print("Connection from %s:%s is closed" % addr)

在示例中,服务器首先向客户端发送欢迎消息,接着询问客户端名称。收到名称后,服务器发送个性化欢迎消息。此过程持续进行,直到接收到客户端发送的“exit”命令,此时退出循环并关闭连接。

完整运行实例与测试

完整实例演示

将上述分步讲解的代码合并,即可形成一个可运行的完整实例。

服务器端完整代码:


import socket
import threading
import time

# 处理tcp连接
def tcplink(conn, addr):
  print("Accept new connection from %s:%s" % addr)
  # 向客户端发送欢迎消息
  conn.send(b"Server: Welcome!\n")
  while True:
    conn.send(b"Server: What's your name?")

    data = conn.recv(1024)
    # 如果客户端发送 exit 过来请求退出,结束循环
    if data == b"exit":
      conn.send(b"Server: Good bye!\n")
      break
    conn.send(b"Server: Hello %s!\n" % data)

  time.sleep(5)
  # 关闭连接
  conn.close()
  print("Connection from %s:%s is closed" % addr)


# 创建 socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 监听端口
s.bind(("127.0.0.1", 6000))
# 设定等待连接的最大数量为5
s.listen(5)
print("Waiting for connection...")
# 等待接收连接
while True:
  # 接受一个新连接
  conn, addr = s.accept()
  # 创建新线程来处理TCP连接
  t = threading.Thread(target=tcplink, args=(conn, addr))
  t.start()

客户端完整代码:


import socket
import time

# 创建 socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

# 建立连接
s.connect(("127.0.0.1", 6000))

# 接收服务器消息
print(s.recv(1024).decode())

for data in [b'Michael', b'Tracy', b'Sarah']:
  # 发送数据
  s.send(data)
  time.sleep(2)
  # 打印接收到的数据
  print(s.recv(1024).decode('utf-8'))
  time.sleep(1)

time.sleep(3)
# 请求退出
s.send(b'exit')
time.sleep(2)
print(s.recv(1024).decode('utf-8'))

# 关闭连接
s.close()

注意,在代码中加入了休眠(sleep)操作,主要是为了控制台能够顺利打印出日志。如果不加休眠,程序运行速度过快,可能导致打印顺序和内容与预期不符。

先运行服务器端代码,再运行客户端代码,服务器端控制台将打印如下内容:


# 服务器端打印消息
Waiting for connection...
Accept new connection from 127.0.0.1:53503
Connection from 127.0.0.1:53503 is closed

客户端控制台打印内容如下:


# 客户端打印消息
Server: Welcome!
Server: What's your name?
Server: Hello Michael!
Server: What's your name?
Server: Hello Tracy!
Server: What's your name?
Server: Hello Sarah!
Server: What's your name?
Server: Good bye!

建议读者对照打印日志与代码逻辑,深入体会服务器端与客户端通信的完整原理。

总结

本文介绍了TCP编程的基本原理,并展示了如何使用Python实现最简单的TCP通信过程。通过理论介绍与实例演示,读者应在脑海中构建起TCP通信的完整流程。熟悉这一基础过程,是处理后续更复杂通信需求的前提。

文中实例代码

以上就是详解Python TCP编程的详细内容,更多关于Python TCP编程的资料请关注本站其它相关文章!

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

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