我在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')
服务器答案:200 OK连接关闭。
回溯(最近一次呼叫最后):文件" navegador.py",第40行,在 HTTP_RCV_CODE = HTTP_RCV_CODE.decode(' utf-8')UnicodeDecodeError:' utf-8'编解码器不能解码位置49中的字节0x9b:无效启动 字节
添加时间延迟解决了我的问题,显然服务器正在发送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
答案 0 :(得分:0)
UTF-8是一种多字节编码。 TCP不是消息协议,而是流协议,因此recv
可以返回分解完整UTF-8多字节字符的字节。
但是,在您的情况下,接收的字节是UTF-8中间字节(它不能作为多字节序列的第一个字节出现),但它出现在接收缓冲区的中间/末尾,所以它看起来像它不是有效的UTF-8。如果有效的UTF-8字符被破坏,如果它位于缓冲区的开头,则应该invalid start byte
,而缓冲区的末尾则是unexpected end of data
。