Discuz! BBS

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 274|回复: 0

使用Python通过Socket传输大文件

[复制链接]

254

主题

363

帖子

2431

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2431
发表于 2025-3-8 17:29:49 | 显示全部楼层 |阅读模式
使用Socket传输大文件(如5GB的mp4文件)时,需要考虑数据的分段传输、接收确认以及异常处理等因素。以下是一个简单的例子,展示了如何使用Python的Socket库来传输大文件。
服务端代码:
  1. import socket
  2. import os

  3. def receive_file(host='127.0.0.1', port=65432, filename='received_file.mp4'):
  4.     # 创建socket对象
  5.     with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
  6.         s.bind((host, port))
  7.         s.listen()
  8.         print(f"Waiting for a connection on {host}:{port}...")
  9.         
  10.         # 接受连接
  11.         conn, addr = s.accept()
  12.         with conn:
  13.             print(f"Connected by {addr}")
  14.             
  15.             # 接收文件大小
  16.             file_size = int(conn.recv(1024).decode('utf-8').strip())
  17.             print(f"File size: {file_size} bytes")
  18.             
  19.             # 接收文件内容
  20.             with open(filename, 'wb') as f:
  21.                 while file_size:
  22.                     chunk = conn.recv(4096)
  23.                     if not chunk:
  24.                         break
  25.                     f.write(chunk)
  26.                     file_size -= len(chunk)
  27.             print(f"File {filename} received successfully.")

  28. if __name__ == "__main__":
  29.     receive_file()
复制代码


客户端代码:
  1. import socket

  2. def send_file(host='127.0.0.1', port=65432, filepath='large_file.mp4'):
  3.     # 创建socket对象
  4.     with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
  5.         s.connect((host, port))
  6.         
  7.         # 发送文件大小
  8.         file_size = os.path.getsize(filepath)
  9.         s.sendall(f"{file_size}".encode('utf-8'))
  10.         
  11.         # 发送文件内容
  12.         with open(filepath, 'rb') as f:
  13.             while file_size:
  14.                 chunk = f.read(4096)
  15.                 s.sendall(chunk)
  16.                 file_size -= len(chunk)
  17.         print(f"File {filepath} sent successfully.")

  18. if __name__ == "__main__":
  19.     send_file()
复制代码


使用说明
服务器端:运行服务器端代码,它会在指定的端口(如65432)上监听连接请求。

客户端:运行客户端代码,并指定要发送的文件路径(如large_file.mp4)。客户端会连接到服务器,发送文件大小,然后逐块发送文件内容。

接收文件:服务器端接收到文件后,会将其保存到本地(默认为received_file.mp4)。

注意事项
异常处理:在实际应用中,应添加异常处理逻辑以处理网络中断、文件读取错误等情况。

性能优化:对于大文件传输,可以考虑使用多线程或异步IO来提高传输效率。

安全性:本示例未考虑数据安全性,如加密传输、身份验证等。在实际应用中,应根据需求添加相应的安全措施。

通过这个简单的例子,您可以了解如何使用Python的Socket库来传输大文件。在实际应用中,可能需要根据具体需求进行进一步的改进和优化。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|DiscuzX

GMT+8, 2025-4-16 07:45 , Processed in 0.017145 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表