首页 > 解决方案 > 错误地从服务器解包消息。Python。插座

问题描述

我想打包一些信息并将其从服务器发送到客户端。然后客户端必须正确解包消息。服务器发送传感器类型(字符串)、通道名称(字符串)和照片(字节)。我做的。我使用通道长度和照片长度,因为它们的大小可以改变。

msg = struct.pack('>3sHI', sensor, len(channel), len(photo)) + channel + photo

对于客户,我有它。

def recv_packets(connection, n):
    piece = b''
    while len(piece) < n:
        packet = connection.recv(n - len(piece))
        if not packet:
            return None
        piece += packet
    return piece


def my_recv(connection):

    sensor = recv_packets(connection, 3)
    if not sensor:
        print("not sensor")
        return None

    sensor_type = struct.unpack('>3s', sensor)[0]


    length_of_channel_name = recv_packets(connection, 2)
    if not length_of_channel_name:
        print("not length of channel name")

        # return None
    else:
        channel_len = struct.unpack('>H', length_of_channel_name)[0]

        # here we must get channel name "ChannelFirst", but we also got ff at start. 
        # ("ffChannelFirst")
        # it isn't right

        channel_name = recv_packets(connection, channel_len + len(sensor) + 1)
        print(channel_name.decode('utf-8'))
        
        #the same code for photo
    
    return photo, channel_name, sensor_type

如您所见,我可以获得正确的频道名称。(我总是从 ff 开始)。然后我无法正确获取照片。而且我不明白出了什么问题。请帮帮我。

标签: pythonsocketsstructserverclient

解决方案


这个字符串不起作用。

msg = struct.pack('>3sHI', sensor, len(channel), len(photo)) + channel + photo

我这样做了。现在一切正常。

    msg = struct.pack('>3sH', sensor, len(channel)) + channel
    msg += struct.pack('>I', len(photo)) + photo 

推荐阅读