如何通过Python Socket完整发送文件,无需逐行读取或分块传输?
Python私密聊天应用:Socket完整发送加密日志文件
我正在开发一款基于Python的私密聊天应用,其中文本日志会被加密后上传至服务器。由于聊天日志属于高度私密文件,我希望通过Socket将文件完整发送至服务器,而无需逐行读取或分块传输。
当前使用的分块传输代码:
import socket def send_file(file_path, conn): with open(file_path, 'rb') as file: data = file.read(1024) # Read and send file in chunks while data: conn.send(data) data = file.read(1024) server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('127.0.0.1', 12345)) server_socket.listen(1) print("Server listening on port 12345") conn, addr = server_socket.accept() print("Connection from:", addr) send_file('example.txt', conn) # Replace 'example.txt' with your file path conn.close() server_socket.close()
实现完整发送文件的方案
如果要一次性发送完整文件,可以直接读取整个文件内容再发送,但需注意:
- 仅适合小体积加密日志文件,大文件会占用过多内存
- 需先发送文件大小,避免接收端出现粘包问题
修改后的发送端代码:
import socket def send_file_full(file_path, conn): with open(file_path, 'rb') as file: # 读取整个文件内容 file_data = file.read() # 先发送8字节的文件大小(支持最大2^64字节的文件) conn.sendall(len(file_data).to_bytes(8, byteorder='big')) # 发送完整文件内容 conn.sendall(file_data) server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('127.0.0.1', 12345)) server_socket.listen(1) print("Server listening on port 12345") conn, addr = server_socket.accept() print("Connection from:", addr) send_file_full('encrypted_log.txt', conn) conn.close() server_socket.close()
对应的服务器接收端代码(需配套实现):
import socket def receive_file_full(save_path, conn): # 先接收文件大小 size_data = conn.recv(8) file_size = int.from_bytes(size_data, byteorder='big') # 接收完整文件内容 file_data = conn.recv(file_size) with open(save_path, 'wb') as file: file.write(file_data) server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server_socket.bind(('127.0.0.1', 12345)) server_socket.listen(1) print("Server listening on port 12345") conn, addr = server_socket.accept() print("Connection from:", addr) receive_file_full('received_encrypted_log.txt', conn) conn.close() server_socket.close()
补充说明:若日志文件体积较大,分块传输仍是更优选择——分块传输不会占用过多内存,配合校验机制能更好保证传输完整性,且文件本身已加密,不会影响私密性。
内容的提问来源于stack exchange,提问作者Monsef
相关产品推荐
相关产品推荐

