gpt4 book ai didi

Python 套接字接收 - 由于收到的消息长度极长而卡在 While 循环中

转载 作者:可可西里 更新时间:2023-11-01 02:53:49 26 4
gpt4 key购买 nike

我有以下服务器和客户端发送实时视频流的代码:

服务器

...
TCP_IP= TCP_IP_LOCAL
TCP_PORT=8093
cap=cv2.VideoCapture(1)
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP,TCP_PORT))

while True:
ret, frame = cap.read()
ret, enc_fram = cv2.imencode('.jpg',frame)
data = pickle.dumps(enc_fram)
print("length is: " + len(data))
s.sendall(struct.pack("L",len(data)) + data)

打印输出:

length is: 93800
length is: 95323
length is: 95519
length is: 95602
...

客户端

data=""
payload_size=struct.calcsize("L")

while True:
print('1) len(data)= %s payload_size= %s ' %(str(len(data)), str(payload_size)))
while len(data) < payload_size:
data_par = conn.recv(4096)
data += data_par
packed_msg_size = data[:payload_size]
data = data[payload_size:]
msg_size = struct.unpack("L",packed_msg_size)[0]

print('2) msg_size = %s' %(str(msg_size)))
while len(data) < msg_size:
data += conn.recv(4096)

打印输出:

1) len(data)=  0  payload_size= 8
2) msg_size = 7887331693890203240

由于 msg_size 太长,客户端卡在了第二个 while 循环中。

一般来说,代码应该没问题。如果服务器在 Laptop1 上运行,它工作正常。如果服务器在 Laptop2 上运行,我会遇到长消息大小的问题。它可能与服务器主机上可能安装的不同包有关吗?

最佳答案

因为你没有开始你的 struct带有说明符的格式字符串,字节顺序和字段大小是每个系统的 native 值——它们不一定相互一致!您似乎正在从 native "L" 所在的系统移动数据format 是 4 个字节,到 8 个字节,因此有效负载的前 4 个字节被误解为长度的一部分。使用类似 "<L" 的格式相反,您将获得标准化的数据布局,这在所有系统上都是相同的。

关于Python 套接字接收 - 由于收到的消息长度极长而卡在 While 循环中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42671703/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com