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/