You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:10:56