Python套接字:无效的起始字节

2024-02-22

我正在使用 Python 套接字来接收文件。但是,有时我会收到以下错误:

Traceback (most recent call last):
  File "C:\Users\Sharkoon\Nextcloud\Elektronik\pythonProject\main.py", line 54, in receive_File
    received = client_socket.recv(BUFFER_SIZE).decode()
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x94 in position 34: invalid start byte

Process finished with exit code 1

这发生在代码的第 4 到第 9 次执行时。难道是我在文件完全发送之前尝试解码?

代码如下:

# device's IP address
SERVER_HOST = "0.0.0.0"
SERVER_PORT = 1337

# receive 4096 bytes each time
BUFFER_SIZE = 4096
SEPARATOR = "<SEPARATOR>"


def receive_File():
    # create the server socket
    # TCP socket
    s = socket.socket()
    # bind the socket to our local address
    s.bind((SERVER_HOST, SERVER_PORT))

    s.listen(5)
    print(f"[*] Listening as {SERVER_HOST}:{SERVER_PORT}")
    # accept connection if there is any
    client_socket, address = s.accept()
    # if below code is executed, that means the sender is connected
    print(f"[+] {address} is connected.")

    # receive the file infos
    # receive using client socket, not server socket
    received = client_socket.recv(BUFFER_SIZE).decode()
    filename, filesize = received.split(SEPARATOR)
    # remove absolute path if there is
    filename = os.path.basename(filename)
    # convert to integer
    filesize = int(filesize)

    # start receiving the file from the socket
    # and writing to the file stream
    progress = tqdm.tqdm(range(filesize), f"Receiving {filename}", unit="B", unit_scale=True, unit_divisor=1024)
    with open(filename, "wb") as f:
        while True:
            # read 1024 bytes from the socket (receive)
            bytes_read = client_socket.recv(BUFFER_SIZE)
            if not bytes_read:
                # nothing is received
                # file transmitting is done
                break
                # write to the file the bytes we just received
            f.write(bytes_read)
            # update the progress bar
            progress.update(len(bytes_read))


    # close the server socket
    s.close()
    return filename

我正在使用的代码来自这里:https://www.thepythoncode.com/article/send-receive-files-using-sockets-python https://www.thepythoncode.com/article/send-receive-files-using-sockets-python


未知服务器提供什么,但根据代码,您期望传输的数据是文件名、一些分隔符、文件大小,然后是实际数据。

received = client_socket.recv(BUFFER_SIZE).decode()
filename, filesize = received.split(SEPARATOR)

这里你假设单个recv将返回一个包含文件名、分隔符和文件大小的缓冲区。具体来说,您期望缓冲区将 a) 包含所有这些 and b) 只有这个。这可能来自于这样的假设:单个send服务器上的内容将与您的完全匹配recv在客户端中。

This 假设是错误的。 TCP是字节流,而不是消息协议。recv(BUFFER_SIZE)将返回最多 BUFFER_SIZE 字节。这可能低于预期数据,但也可能更多。

具体来说,它可能已经包含文件中的二进制数据,该数据无法解码为 utf-8 - 导致:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x94 in position 34: invalid start byte

要修复此问题,您需要知道 utf-8 编码的标头在哪里结束以及二进制数据在哪里开始。这可以通过在服务器中的标头前添加长度前缀或在文件大小和文件内容之间添加另一个分隔符来完成。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python套接字:无效的起始字节 的相关文章

随机推荐

  • 如何在 Rails 4 中设置自定义字符串外键?

    如何设置关联以使用字符串foreign key正确设置has one class Pharmaceutic lt ActiveRecord Base has one pharmaceutic group foreign key code e
  • 使用 Prawn 在 pdf 中添加图像

    我在使用 Prawn 作为 pdf 生成器将图像添加到 PDF 时遇到问题 我正在尝试使用以下代码添加图像 def header text something image Prawn DATADIR images logo small pn
  • 将 R 中的值列表替换为另一个值列表

    我有一个包含任何这些值的数据框 from c A C G T R Y M K W S N 我想相应地替换为 to c AA CC GG TT AG CT AC GT AT CG NN 最好的方法是什么 循环替换所有值 或循环矩阵位置 或任何
  • 与接口同名的 TypeScript 类

    我想声明一个名为Date它有一个 Date 类型的属性 如 JavaScript 的 TypeScript 接口 日期对象 https developer mozilla org en US docs Web JavaScript Refe
  • 错误 LNK1104:无法打开文件“mfc90.lib”

    我正在使用 Visual Studio 2012 Professional 我的项目参考使用 VS2008 v90 构建的静态库 当我使用 VS2012 v110 构建时 error LNK1104 cannot open file mfc
  • 构造函数不接受我的信息

    所以构造函数是说 是预期的 错误不是声明 并且 预期的 Person num1 num2 num3 num1 new Person Allison 6600 Crescent Ave 32 9024231421 num2 new Perso
  • 最大夏普比率投资组合因 PortfolioAnalytics 中的错误而失败

    在计算简单的最大夏普比率投资组合权重时 我在 PortfolioAnalytics 中遇到了一个问题 Error in max sr opt R R constraints constraints moments moments Objec
  • Python:在曲线和轴之间填充颜色并区域化区域

    我在 Excel 工作表上有两条曲线的一组 x y 值 使用xlrd模块 我已经能够将它们绘制如下 问题 如何使用不同的填充颜色对三个区域进行着色 曾尝试过fill between但由于不知道如何与x轴和y轴关联而没有成功 心中的结局如下图
  • PHP:如何删除索引后的所有数组元素[重复]

    这个问题在这里已经有答案了 是否可以删除索引后的所有数组元素 myArrayInit array 1 gt red 30 gt orange 25 gt velvet 45 gt pink 现在一些 魔法 myArray delIndex
  • PySide:如何在 QPushButton 单击槽中获取单击的 QPushButton 对象?

    我是 PySide 的新手 我想在其单击的插槽中获取 QPushButton 对象 例如使用它来获取其文本 button QtGui QPushButton start go button clicked connect self butt
  • 如何向引用添加事件监听器?

    如何添加事件监听器ref使用 ReactJS Hooks 版本 16 8 这是一个示例 我尝试使用 Overflow auto 获取某些 div 的滚动位置 updateScrollPosition永远不会被叫到 function Exam
  • MongoDB minidump文件路径错误

    我最近卸载了 MongoDB 3 2 以安装 MongoDB 3 6 从那时起 每次我尝试启动 mongod 时 都会收到以下错误 failed to open minidump file C Program Files MongoDB S
  • 如何正确重用 Jackson ObjectMapper?

    我对 ObjectMapper 的工作方式以及在我的应用程序中的一般使用感到满意 我想了解的是实现 ObjectMapper 以确保它被重用并且我不会在应用程序中创建不必要的实例的最佳方法 我的想法是 我可以在 Utils 类中声明 Obj
  • RxJS SkipWhile 与过滤器

    SkipWhile 和过滤器运算符有什么区别 const source interval 1000 const example source pipe skipWhile val gt val lt 5 const subscribe ex
  • 这是一个什么样的对象,反应式的?

    我的 Server R 中有这段代码 selection1 lt reactive filter filter DF1 PC in input dynamic AGE gt input age 1 AGE lt input age 2 DF
  • akka-camel 2.2.1 使用 Spring XML 定义路由

    我使用的是 akka camel 2 2 1 需要分别配置往返于 Consumer 和 Producer Actor 的路由 我目前正在定义路由并以编程方式将它们添加到 CamelExtension 内的内部 Camel 上下文中 如下所示
  • Android:无法使用 CustomAdapter 刷新 Listview

    我需要用新数据刷新列表视图 下面这段代码用于获取数据OnCreateView那是在FragmentActivity在第一时间 override fun onCreateView inflater LayoutInflater contain
  • 多处理管道 send() 块

    根据Python文档 只有recv 阻止但不阻止send 我编写了以下代码尝试制作 GUI 数独游戏 我这样做的方式是即使我可以更新游戏板tkinter正在执行其mainloop 然而 在测试运行过程中 我发现如果我在游戏更新时关闭窗口 p
  • 跨域 AJAX/Javascript - 人为地使用 sessionid

    我目前有一个 RESTful Web 服务 它通过会话识别客户端 我有一个客户端 它使用 ajax javascript 来访问 RESTful Web 服务的内容 我通过使用标头响应请求来允许这种情况发生 Access Control A
  • Python套接字:无效的起始字节

    我正在使用 Python 套接字来接收文件 但是 有时我会收到以下错误 Traceback most recent call last File C Users Sharkoon Nextcloud Elektronik pythonPro