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"
之类的格式,您将获得标准化的数据布局,这在所有系统上都是相同的。
我有以下代码供服务器和客户端发送实时视频流:
服务器
...
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"
之类的格式,您将获得标准化的数据布局,这在所有系统上都是相同的。