【发布时间】:2021-06-15 12:00:23
【问题描述】:
我正在使用socket.socket(socket.AF_INET, socket.SOCK_STREAM) 类型的阻塞python 套接字将消息从我的客户端发送到我的服务器。如果我快速连续(但不是同时)发送消息,我的服务器上会出现以下错误:
in receive
size = int(rec_sock.recv(HEADER_SIZE).decode('utf-8'))
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0: invalid start byte
在每条消息之前,我都会发送一个标头,其中包含以下消息的长度。标头由客户端以 UTF-8 编码,因此不应引发此错误。标头也是客户端尝试使用 UTF-8 解码的唯一消息部分,所以我不确定这个错误是如何发生的。
我正在使用以下方法来发送、接收和制作标头:
BUF_SIZE = 16384
HEADER_SIZE = 16
def receive(rec_sock: socket.socket) -> Any:
message = b''
size = int(rec_sock.recv(HEADER_SIZE).decode('utf-8'))
if size:
while len(message) < size:
data = rec_sock.recv(BUF_SIZE)
message += data
return pickle.loads(message) if len(message) else None
def send(resp: Any, send_sock: socket.socket) -> None:
pickeled = pickle.dumps(resp)
send_sock.send(make_header(len(pickeled)))
send_sock.send(pickeled)
def make_header(msg_size: int) -> bytes:
encoded = str(msg_size).encode('utf-8')
return b'0' * (HEADER_SIZE - len(encoded)) + encoded
【问题讨论】:
标签: python python-3.x sockets server tcp