Python TCP编程详解:从原理到代码实现
本文详解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编程的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













