|
使用Socket传输大文件(如5GB的mp4文件)时,需要考虑数据的分段传输、接收确认以及异常处理等因素。以下是一个简单的例子,展示了如何使用Python的Socket库来传输大文件。
服务端代码:
- import socket
- import os
- def receive_file(host='127.0.0.1', port=65432, filename='received_file.mp4'):
- # 创建socket对象
- with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
- s.bind((host, port))
- s.listen()
- print(f"Waiting for a connection on {host}:{port}...")
-
- # 接受连接
- conn, addr = s.accept()
- with conn:
- print(f"Connected by {addr}")
-
- # 接收文件大小
- file_size = int(conn.recv(1024).decode('utf-8').strip())
- print(f"File size: {file_size} bytes")
-
- # 接收文件内容
- with open(filename, 'wb') as f:
- while file_size:
- chunk = conn.recv(4096)
- if not chunk:
- break
- f.write(chunk)
- file_size -= len(chunk)
- print(f"File {filename} received successfully.")
- if __name__ == "__main__":
- receive_file()
复制代码
客户端代码:
- import socket
- def send_file(host='127.0.0.1', port=65432, filepath='large_file.mp4'):
- # 创建socket对象
- with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
- s.connect((host, port))
-
- # 发送文件大小
- file_size = os.path.getsize(filepath)
- s.sendall(f"{file_size}".encode('utf-8'))
-
- # 发送文件内容
- with open(filepath, 'rb') as f:
- while file_size:
- chunk = f.read(4096)
- s.sendall(chunk)
- file_size -= len(chunk)
- print(f"File {filepath} sent successfully.")
- if __name__ == "__main__":
- send_file()
复制代码
使用说明
服务器端:运行服务器端代码,它会在指定的端口(如65432)上监听连接请求。
客户端:运行客户端代码,并指定要发送的文件路径(如large_file.mp4)。客户端会连接到服务器,发送文件大小,然后逐块发送文件内容。
接收文件:服务器端接收到文件后,会将其保存到本地(默认为received_file.mp4)。
注意事项
异常处理:在实际应用中,应添加异常处理逻辑以处理网络中断、文件读取错误等情况。
性能优化:对于大文件传输,可以考虑使用多线程或异步IO来提高传输效率。
安全性:本示例未考虑数据安全性,如加密传输、身份验证等。在实际应用中,应根据需求添加相应的安全措施。
通过这个简单的例子,您可以了解如何使用Python的Socket库来传输大文件。在实际应用中,可能需要根据具体需求进行进一步的改进和优化。
|
|