【问题标题】:Socket received invalid start byte (UnicodeDecodeError, SOCK_STREAM)套接字接收到无效的起始字节 (UnicodeDecodeError, SOCK_STREAM)
【发布时间】: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


    【解决方案1】:

    问题是我总是在接收方法中填充整个缓冲区,即使剩余消息的长度小于缓冲区大小。正因为如此,如果在短时间内连续发送了两条消息,则下一条消息的标头被上一个调用接收读取,并且下一条消息的实际内容被读取为标头(无法通过 utf 解码) -8)。

    将接收方法更改为此修复它:

    def receive(rec_sock: socket.socket) -> Any:
        message = b''
        size = int(rec_sock.recv(HEADER_SIZE).decode('utf-8'))
        print("Waiting for", size, "bytes ...")
    
        if size:
            while len(message) < size:
                remaining = size - len(message)
                read_len = BUF_SIZE if remaining >= BUF_SIZE else remaining
                data = rec_sock.recv(read_len)
                message += data
    
            print("Received", len(message), "bytes.")
    
        return pickle.loads(message) if len(message) else None
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 1970-01-01
      • 2017-04-09
      相关资源
      最近更新 更多