下面是实现 Python 多线程 TCP 服务端的攻略,包括如下步骤:
- 导入相关模块
Python 实现多线程 TCP 服务端需要用到 socket 和 threading 模块,因此需要在开头导入这两个模块:
import socket
import threading
- 创建 socket 对象
在 Python 中,使用 socket 模块的 socket() 函数创建 TCP 服务端的 socket 套接字,如下所示:
# 创建 socket 对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
其中,第一个参数 socket.AF_INET 是 IP 协议族,表示用 IPv4 地址进行通信;第二个参数 socket.SOCK_STREAM 是通信协议,表示使用 TCP 协议实现。
- 绑定 IP 和端口号
使用 bind() 方法将服务端 IP 地址和监听的端口号绑定到 socket 对象上,如下所示:
# 绑定 IP 地址和端口号
HOST, PORT = '127.0.0.1', 8888
server_socket.bind((HOST, PORT))
其中,HOST 是服务端的 IP 地址,可以用本地回环地址 127.0.0.1。PORT 是服务端监听的端口号,可以使用一个未被占用的端口号。
- 开始监听连接
使用 listen() 方法开始监听客户端的连接请求,如下所示:
# 开始监听客户端连接
server_socket.listen(10)
其中,listen() 方法的参数是服务端最大连接数,这里置为10。
- 实现多线程处理客户端连接
使用多线程(threading)模块,创建一个线程处理一个客户端的请求。每次有新的客户端连接时,创建一个新的线程,如下所示:
# 创建多线程处理客户端连接
def handle_client(client_socket, client_address):
pass
while True:
# 接受客户端连接请求
client_socket, client_address = server_socket.accept()
# 创建新线程处理客户端请求
client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
client_thread.start()
其中,在 handle_client() 方法中,编写处理客户端数据的代码。而在 while 循环中,使用 accept() 方法接受客户端连接请求,然后创建一个新的线程处理客户端数据。
- 实现 handle_client() 方法
在 handle_client() 方法中,需要实现与客户端的数据交互功能。其中,使用 recv() 方法接收客户端发送的数据,使用 send() 方法向客户端发送数据,如下所示:
# 处理客户端数据
def handle_client(client_socket, client_address):
print('客户端 %s:%s 连接成功!' % client_address)
while True:
# 接受客户端数据
client_data = client_socket.recv(1024)
if not client_data:
break
print('客户端 %s:%s 发送的数据为: %s' % (client_address[0], client_address[1], client_data.decode('utf-8')))
# 向客户端发送数据
server_data = '已收到数据: %s' % client_data.decode('utf-8')
client_socket.send(server_data.encode('utf-8'))
print('客户端 %s:%s 断开连接!' % client_address)
# 关闭客户端连接
client_socket.close()
在 while 循环中,循环接收客户端发送的数据,并打印输出。如果客户端不再发送数据,则跳出循环。接着,使用 send() 方法向客户端发送数据,然后关闭客户端连接。
示例一:带时间戳的数据交换
# 处理客户端数据
def handle_client(client_socket, client_address):
print('客户端 %s:%s 连接成功!' % client_address)
while True:
# 接受客户端数据
client_data = client_socket.recv(1024)
if not client_data:
break
print('客户端 %s:%s 发送的数据为: %s' % (client_address[0], client_address[1], client_data.decode('utf-8')))
# 获取当前时间戳
timestamp = int(time.time())
# 构造服务器响应数据
server_data = '[%s] 已收到数据: %s' % (timestamp, client_data.decode('utf-8'))
# 向客户端发送数据
client_socket.send(server_data.encode('utf-8'))
print('客户端 %s:%s 断开连接!' % client_address)
# 关闭客户端连接
client_socket.close()
在服务器响应数据中添加了当前时间戳,以区分不同的响应数据。
示例二:实现简单的加法计算
# 处理客户端数据
def handle_client(client_socket, client_address):
print('客户端 %s:%s 连接成功!' % client_address)
while True:
# 接受客户端数据
client_data = client_socket.recv(1024)
if not client_data:
break
print('客户端 %s:%s 发送的数据为: %s' % (client_address[0], client_address[1], client_data.decode('utf-8')))
# 解析客户端发送的计算请求: 1+2
expression = client_data.decode('utf-8').strip()
if '+' in expression:
a, b = expression.split('+')
result = int(a) + int(b)
# 构造服务器响应数据
server_data = '计算结果为: %s' % result
else:
# 构造错误提示响应数据
server_data = '计算表达式不合法,请输入正确的加法计算表达式,如:2+3'
# 向客户端发送数据
client_socket.send(server_data.encode('utf-8'))
print('客户端 %s:%s 断开连接!' % client_address)
# 关闭客户端连接
client_socket.close()
在服务器端,解析客户端发送的加法计算请求,并计算响应结果返回给客户端。如果客户端发送的数据不是合法的计算表达式,服务器会发送错误提示响应数据。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python多线程实现TCP服务端 - Python技术站