python 多客户端上传文件到服务端 服务端要多线程
时间: 2023-07-22 22:09:30 浏览: 232
服务器、客户端多线程传送文件
要实现Python多客户端上传文件到服务端,并且服务端要支持多线程,可以使用`threading`模块来创建多线程。具体步骤如下:
1. 服务端创建socket并监听端口,等待客户端连接。
2. 客户端连接服务端,并发送要上传的文件名和大小等信息。
3. 服务端接收客户端发送的信息,并创建一个同名文件,准备接收文件内容。
4. 创建一个新线程,用于接收文件内容并写入文件。
5. 客户端发送文件传输结束的标志。
6. 服务端接收标志并关闭连接。
以下是Python示例代码:
服务端代码:
```python
import socket
import threading
import os
SERVER_HOST = '0.0.0.0'
SERVER_PORT = 5000
BUFFER_SIZE = 4096
def handle_client(client_socket, client_addr):
# 接收文件名和大小等信息
file_info = client_socket.recv(BUFFER_SIZE).decode()
file_name, file_size = file_info.split(':')
file_size = int(file_size)
print(f'Receiving file "{file_name}" ({file_size} bytes) from client {client_addr}')
# 创建同名文件并准备接收文件内容
with open(file_name, 'wb') as f:
# 创建新线程,用于接收文件内容并写入文件
def receive_file():
received_size = 0
while received_size < file_size:
data = client_socket.recv(BUFFER_SIZE)
f.write(data)
received_size += len(data)
print(f'File "{file_name}" received from client {client_addr}')
thread = threading.Thread(target=receive_file)
thread.start()
# 等待新线程结束
thread.join()
# 关闭连接
client_socket.close()
def main():
# 创建socket并监听端口
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((SERVER_HOST, SERVER_PORT))
server_socket.listen(1)
print(f'Server listening on port {SERVER_PORT}')
while True:
# 等待客户端连接
client_socket, client_addr = server_socket.accept()
print(f'Client {client_addr} connected')
# 创建新线程,用于处理客户端连接
thread = threading.Thread(target=handle_client, args=(client_socket, client_addr))
thread.start()
if __name__ == '__main__':
main()
```
客户端代码同上。
在上面的示例代码中,服务端使用了多线程,每个客户端连接都会创建一个新线程。在新线程中接收文件内容并写入文件,主线程则负责处理客户端连接并创建新线程。使用多线程可以提高服务端的并发性能。另外,在多线程编程中,需要注意线程安全问题,如共享变量的修改等。
阅读全文