Python中的多线程套接字,消息错误unicodedecodee

2024-04-27 07:19:28 发布

您现在位置:Python中文网/ 问答频道 /正文

Unicode DecodeError(向客户端发送消息时)

我正在用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.

UniUnicodeDecodeError

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


[解决方案]

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

服务器

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

Tags: self服务器http消息客户端closesizebuffer
1条回答
网友
1楼 · 发布于 2024-04-27 07:19:28

UTF-8是一种多字节编码。TCP不是消息协议,而是流协议,因此recv可以返回将完整的UTF-8多字节字符分开的字节。你知道吗

不过,在您的示例中,接收的字节是UTF-8中间字节(它不能作为多字节序列的第一个字节出现),但它出现在接收缓冲区的中间/结尾,因此看起来它不是有效的UTF-8。如果一个有效的UTF-8字符被打断,那么如果它在缓冲区的开头,那么应该得到invalid start byte,如果它在缓冲区的结尾,那么应该得到unexpected end of data。你知道吗

相关问题 更多 >