python 多客户端上传文件到服务端
时间: 2023-09-03 20:07:25 浏览: 145
文件上传 (服务端+客户端)
要实现Python多客户端上传文件到服务端,可以使用socket和os模块。具体步骤如下:
1. 服务端创建socket并监听端口,等待客户端连接。
2. 客户端连接服务端,并发送要上传的文件名和大小等信息。
3. 服务端接收客户端发送的信息,并创建一个同名文件,准备接收文件内容。
4. 客户端读取文件内容并发送给服务端。
5. 服务端接收文件内容并写入文件,直到文件全部接收完毕。
6. 客户端发送文件传输结束的标志。
7. 服务端接收标志并关闭连接。
以下是Python示例代码:
服务端代码:
```python
import socket
import os
SERVER_HOST = '0.0.0.0'
SERVER_PORT = 5000
BUFFER_SIZE = 4096
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')
# 接收文件名和大小等信息
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)')
# 创建同名文件并准备接收文件内容
with open(file_name, 'wb') as f:
# 接收文件内容
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')
# 关闭连接
client_socket.close()
if __name__ == '__main__':
main()
```
客户端代码:
```python
import socket
import os
SERVER_HOST = '127.0.0.1'
SERVER_PORT = 5000
BUFFER_SIZE = 4096
def send_file(file_path):
# 获取文件名和大小等信息
file_name = os.path.basename(file_path)
file_size = os.path.getsize(file_path)
file_info = f'{file_name}:{file_size}'
# 连接服务端并发送文件名和大小等信息
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((SERVER_HOST, SERVER_PORT))
client_socket.send(file_info.encode())
print(f'Sending file "{file_name}" ({file_size} bytes)')
# 发送文件内容
with open(file_path, 'rb') as f:
sent_size = 0
while sent_size < file_size:
data = f.read(BUFFER_SIZE)
client_socket.send(data)
sent_size += len(data)
print(f'File "{file_name}" sent')
# 发送文件传输结束的标志
client_socket.send('EOF'.encode())
# 关闭连接
client_socket.close()
def main():
file_path = 'test.txt'
send_file(file_path)
if __name__ == '__main__':
main()
```
在上面的示例代码中,服务端和客户端都使用了4096字节的缓冲区大小,可以根据实际情况进行调整。另外,在文件传输过程中,需要注意处理异常情况,如连接断开等。
阅读全文