python - Python中的多线程套接字,消息报错UniUnicodeDecodeError

标签 python multithreading sockets http tcp

UniUnicodeDecodeError(向客户端发送消息时)

我在 python 中实现服务器/客户端套接字,以下代码有时引发 UniUnicodeDecodeError 异常。我不知道为什么有时有效有时无效。请帮助...


服务器

conn.sendall('200 OK'.encode('utf-8'))
while l:
    self.conn.sendall(l)
    l = f.read(BUFFER_SIZE)
    if not l:
         f.close()
         self.conn.close()
         break

客户端

HTTP_RCV_CODE = tcp_sock.recv(BUFFER_SIZE)
HTTP_RCV_CODE = HTTP_RCV_CODE.decode('utf-8')

什么时候工作

Server answer: 200 OK Connection close.

UniUnicode解码错误

Traceback (most recent call last): File "navegador.py", line 40, in HTTP_RCV_CODE = HTTP_RCV_CODE.decode('utf-8') UnicodeDecodeError: 'utf-8' codec can't decode byte 0x9b in position 49: invalid start byte


[解决方案]

只需添加一个时间延迟就可以解决我的问题,显然服务器正在发送 200 OK 消息和文件的某些部分。

服务器

conn.sendall('200 OK'.encode('utf-8'))
time.sleep(0.1)

while l:
    self.conn.sendall(l)
    l = f.read(BUFFER_SIZE)
    if not l:
         f.close()
         self.conn.close()
         break

最佳答案

UTF-8 是一种多字节编码。 TCP 不是消息协议(protocol)而是流协议(protocol),因此 recv 可以返回拆分完整 UTF-8 多字节字符的字节。

但是,在您的情况下,收到的字节是 UTF-8 中间字节(它不能作为多字节序列的第一个字节出现),但它出现在您收到的缓冲区的中间/末尾,所以它看起来像它不是有效的 UTF-8。如果一个有效的 UTF-8 字符被破坏,你应该得到 invalid start byte 如果它在你的缓冲区的开头,并且 unexpected end of data 在结尾缓冲区。

关于python - Python中的多线程套接字,消息报错UniUnicodeDecodeError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46860663/

相关文章:

python - 如何在 python ReportLab 中将横向布局更改为纵向布局?

python - 如何在由python中的另一个函数创建之前读取文本文件

c# - 多线程 Web 应用程序

sockets - 你能在没有互联网的情况下通过 IP/TCP 通话吗?

python - 插入不是默认 DJANGO 的数据库

multithreading - 什么是过程交错? (在并发领域)

c++ - 线程和上下文切换 C++

node.js - 为什么在聊天应用程序中使用 redis?

java - 通过套接字发送 System.out

python - 了解 : "def rangeSumBST(self, root: TreeNode, L: int, R: int) -> int:" on leetcode