python - 错误地从服务器解包消息。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 开始)。然后我无法正确获取照片。而且我不明白出了什么问题。请帮帮我。
解决方案
这个字符串不起作用。
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
推荐阅读
- ios - 是否可以在委托方法中使用完成处理程序 - Swift
- html - 使用 CSS 网格和布局对齐
- javascript - 如何在 JS 或 jQuery 中打印数组的字段
- javascript - 使用 jQuery 显示/隐藏在循环中生成的具有特定类和 id 的表行
- laravel-backpack - 在父表单中编辑子数据(例如,参见屏幕截图)
- php - Html和引导轮播问题
- java - 如果文件不存在则创建 FileReader
- java - 程序返回以前的信息而不是新的信息
- java - OpenCV(java)魔方识别颜色校正
- javascript - 如何使用 switch 和 if else 以及 HTML 表单选择标记在输入框中获取所需的值