【问题标题】:python sockets send file function explanationpython sockets发送文件功能解释
【发布时间】:2021-01-10 22:27:27
【问题描述】:

我正在尝试学习 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)

【问题讨论】:

    标签: python sockets python-sockets


    【解决方案1】:

    编写此协议是为了先发送文件的大小,然后再发送其数据。大小为 20 个八位字节(字节),序列化为“大端”,这意味着首先发送最高有效字节。假设你有一个 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
    

    【讨论】:

    • 感谢您的解释,您知道基于此的接收文件功能如何吗?会有帮助的
    • @BarCode,说谢谢的方式就是投票(如果你还没有投票的话)和accept the answer
    猜你喜欢
    • 1970-01-01
    • 2014-09-30
    • 2021-09-07
    • 2019-07-10
    • 2012-12-26
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多