python sockets发送文件功能说明

python sockets send file function explanation

我正在尝试学习 python 套接字编程(网络),我有一个发送文件的函数,但我没有完全理解这个函数的每一行(无法理解它) .有人可以逐行解释这是在做什么吗?我也不确定为什么它需要数据的长度来发送文件。另外,如果您也能看到此功能的任何改进,谢谢。

def send_file(socket, filename):
    with open(filename, "rb") as x:
        data = x.read()
        length_data = len(data)
        try:
            socket.sendall(length_data.to_bytes(20, 'big'))
            socket.sendall(data)
        except Exception as error:
            print("Error", error)

编写此协议首先发送文件的大小,然后再发送其数据。大小为 20 个八位字节(字节),序列化为“big endian”,这意味着首先发送最重要的字节。假设你有一个 1M 的文件,

>>> val = 1000000
>>> val.to_bytes(20, 'big')
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0fB@'

程序发送这 20 个字节,然后发送文件负载本身。接收方将读取 20 个八位字节,将其转换回文件大小,并确切知道该文件还需要接收多少个八位字节。 TCP 是一种流式传输协议。它不知道消息边界。协议需要某种方式来告诉对方有多少数据构成了一条消息,这是一种常见的方式。

顺便说一句,这段代码有一个严重的问题,它会一次读取整个文件。假设它很大,这段代码会崩溃。

接收器看起来像下面这样。这是一个初级。

import io
def recv_exact(skt, count):
    buf = io.BytesIO()
    while count:
        data = skt.recv(count)
        if not data:
            return b"" # socket closed
        buf.write(data)
        count -= len(data)
    return buf.getvalue()

def recv_file(skt):
    data = recv_exact(skt, 20)
    if not data:
        return b""
    file_size = int.from_bytes(data, "big")
    file_bytes = recv_exact(skt, file_size)
    return file_bytes