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

Python socket receive - hanging in While-loop due to extremely long received message length

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

服务器

...
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 格式字符串没有以说明符开头,因此字节顺序和字段大小是每个系统的本机值 - 它们不一定相互一致!您似乎正在将数据从本机 "L" 格式为 4 字节的系统移动到 8 字节的系统,因此有效负载的前 4 个字节被误解为长度的一部分。使用 "<L" 之类的格式,您将获得标准化的数据布局,这在所有系统上都是相同的。