TCP是一种面向连接的、可靠的传输层协议,在Python中可以通过内置的socket模块实现TCP服务端,实现不同设备之间的稳定网络通信。服务端的核心作用是监听指定端口,接收客户端的连接请求,处理数据交互并维持连接稳定。

TCP服务端基础实现步骤
实现一个基础的TCP服务端需要遵循固定的流程,主要分为创建socket对象、绑定端口、监听连接、接收连接、数据收发、关闭连接这几个步骤。
1. 创建socket对象
首先需要导入socket模块,创建一个基于IPv4和TCP协议的socket对象,具体代码如下:
import socket # 创建TCP socket对象,AF_INET表示IPv4,SOCK_STREAM表示TCP协议 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
2. 绑定端口与监听
创建好socket对象后,需要将其绑定到指定的IP地址和端口上,然后开启监听模式,等待客户端连接。绑定的地址如果是本机可以使用空字符串表示监听所有网卡:
# 绑定地址和端口,空字符串表示监听所有本地网卡,端口自定义避免冲突
server_address = ('', 8888)
server_socket.bind(server_address)
# 开启监听,参数表示最大等待连接数
server_socket.listen(5)
print('TCP服务端已启动,监听端口8888')
3. 接收客户端连接与数据交互
监听开启后,服务端会阻塞等待客户端连接,当有客户端接入时,会返回客户端的socket对象和地址信息,之后就可以通过该socket对象进行数据收发:
# 阻塞等待客户端连接,返回客户端socket和地址
client_socket, client_address = server_socket.accept()
print(f'客户端 {client_address} 已连接')
# 接收客户端发送的数据,1024表示缓冲区大小
data = client_socket.recv(1024)
print(f'收到客户端数据:{data.decode("utf-8")}')
# 向客户端发送响应数据
response = '已收到你的消息'
client_socket.send(response.encode('utf-8'))
# 关闭客户端连接和服务端socket
client_socket.close()
server_socket.close()
支持多客户端并发的TCP服务端
上面的基础实现只能处理一个客户端的连接,处理完之后就会关闭,实际场景中需要同时处理多个客户端的连接请求,这时可以通过多线程的方式实现并发处理。
多线程实现思路
每当有新的客户端连接时,就创建一个新的线程来处理该客户端的通信,主线程继续等待其他客户端的连接,这样就不会阻塞后续的连接请求。
import socket
import threading
def handle_client(client_socket, client_address):
"""处理单个客户端通信的线程函数"""
print(f'线程启动,处理客户端 {client_address}')
try:
while True:
# 持续接收客户端数据
data = client_socket.recv(1024)
if not data:
# 客户端断开连接,数据为空
print(f'客户端 {client_address} 已断开连接')
break
print(f'收到 {client_address} 的消息:{data.decode("utf-8")}')
# 响应客户端
client_socket.send(f'已收到你的消息:{data.decode("utf-8")}'.encode('utf-8'))
except Exception as e:
print(f'处理客户端 {client_address} 时发生异常:{e}')
finally:
# 无论是否异常都关闭客户端socket
client_socket.close()
def main():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 设置端口复用,避免服务端重启时端口被占用
server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
server_address = ('', 8888)
server_socket.bind(server_address)
server_socket.listen(5)
print('多线程TCP服务端已启动,监听端口8888')
while True:
# 主线程持续等待新连接
client_socket, client_address = server_socket.accept()
# 创建新线程处理客户端通信
client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
client_thread.daemon = True # 设置为守护线程,主线程退出时子线程也退出
client_thread.start()
if __name__ == '__main__':
main()
实现时的注意事项
- 端口选择要避免使用已经被其他程序占用的端口,1024以下的端口通常需要管理员权限才能绑定。
- 数据收发时要注意编码统一,通常使用utf-8编码避免乱码问题。
- 一定要做好异常捕获,避免客户端异常断开导致服务端崩溃。
- 长时间运行的服务端建议设置socket的超时时间,避免资源长期占用。
- 如果需要处理大量并发连接,可以考虑使用selectors模块或者异步IO的方式,性能会优于多线程。
简单客户端测试代码
可以使用以下简单的TCP客户端代码测试服务端的运行效果:
import socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 连接服务端,地址为服务端所在IP,本机测试用127.0.0.1
client_socket.connect(('127.0.0.1', 8888))
# 发送测试数据
client_socket.send('你好,TCP服务端'.encode('utf-8'))
# 接收服务端响应
response = client_socket.recv(1024)
print(f'收到服务端响应:{response.decode("utf-8")}')
client_socket.close()
PythonTCP_serversocket多线程修改时间:2026-06-13 08:39:30