python基于tcp 多客户端网络传输的架构,实现本地图片的传输和保存
时间: 2024-03-17 07:45:19 浏览: 17
Python基于TCP多客户端网络传输的架构可以使用socket和threading等模块来实现。以下是一个简单的实现本地图片传输和保存的示例代码:
```python
import socket
import threading
import os
# 服务器地址和端口
SERVER_ADDRESS = 'localhost'
SERVER_PORT = 9999
# 保存图片的目录
SAVE_DIR = 'saved_images'
# 创建保存图片的目录
if not os.path.exists(SAVE_DIR):
os.makedirs(SAVE_DIR)
def handle_client(client_socket):
# 接收文件名和文件大小
filename = client_socket.recv(1024).decode()
filesize = int(client_socket.recv(1024).decode())
# 保存文件
filepath = os.path.join(SAVE_DIR, filename)
with open(filepath, 'wb') as f:
remaining_size = filesize
while remaining_size > 0:
data = client_socket.recv(1024)
f.write(data)
remaining_size -= len(data)
print(f'Saved {filename} ({filesize} bytes) to {SAVE_DIR}')
# 关闭客户端连接
client_socket.close()
def main():
# 创建服务器socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((SERVER_ADDRESS, SERVER_PORT))
server_socket.listen(5)
print(f'Server listening on {SERVER_ADDRESS}:{SERVER_PORT}')
while True:
# 接受客户端连接
client_socket, client_address = server_socket.accept()
print(f'Accepted connection from {client_address[0]}:{client_address[1]}')
# 创建线程处理客户端请求
client_thread = threading.Thread(target=handle_client, args=(client_socket,))
client_thread.start()
if __name__ == '__main__':
main()
```
客户端代码如下:
```python
import socket
import os
# 服务器地址和端口
SERVER_ADDRESS = 'localhost'
SERVER_PORT = 9999
# 需要传输的图片路径
IMAGE_PATH = 'test.jpg'
def main():
# 创建客户端socket
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect((SERVER_ADDRESS, SERVER_PORT))
# 发送文件名和文件大小
filename = os.path.basename(IMAGE_PATH)
filesize = os.path.getsize(IMAGE_PATH)
client_socket.send(filename.encode())
client_socket.send(str(filesize).encode())
# 发送文件内容
with open(IMAGE_PATH, 'rb') as f:
remaining_size = filesize
while remaining_size > 0:
data = f.read(1024)
client_socket.send(data)
remaining_size -= len(data)
print(f'Sent {filename} ({filesize} bytes) to server')
# 关闭客户端连接
client_socket.close()
if __name__ == '__main__':
main()
```
在运行服务器代码之前,需要先启动客户端代码,并且确保`test.jpg`文件存在。启动服务器代码后,客户端会将`test.jpg`文件传输到服务器,并保存到`saved_images`目录中。