python socket pickled numpy 数据未显示
python socket pickled numpy data not showing up
我正在尝试通过套接字发送 python-opencv 帧。我正在对数据进行 pickle 和 unpickling,但由于某种原因它是空白的或者什么都没有显示。
这是我 运行 client.py
时的终端
new message length: b'720 '
它应该从服务器流式传输网络摄像头,但没有显示任何内容。
这是我的客户端和服务器代码:
client.py
import socket
import numpy as np
import cv2
import pickle
HEADERSIZE = 10
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 1232))
while True:
full_msg = b''
new_msg = True
while True:
msg = s.recv(16)
if new_msg:
print(f'new message length: {msg[:HEADERSIZE]}')
msglen = int(msg[:HEADERSIZE])
new_msg = False
full_msg += msg
if len(full_msg)-HEADERSIZE == msglen:
print('full msg recvd')
print(full_msg[HEADERSIZE:])
d = pickle.loads(full_msg[HEADERSIZE:])
print(d)
cv2.namedWindow('Webcam', cv2.WINDOW_NORMAL)
cv2.imshow('Webcam', full_msg[HEADERSIZE:])
new_msg = True
full_msg = b''
print(full_msg)
server.py
import socket
import numpy as np
import cv2
import time
import pickle
from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE, SIG_DFL)
HEADERSIZE = 10
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 1232))
s.listen(5)
cap = cv2.VideoCapture(0)
while True:
clientsocket, address = s.accept()
print(f"Connection from {address} has been established!")
while True:
ret, frame = cap.read()
msg = pickle.dumps(frame)
print(frame)
msg = bytes(f'{len(frame):<{HEADERSIZE}}', "utf-8") + msg
clientsocket.send(msg)
我不知道为什么什么都没有出现。我什至不知道是否有任何事情发生。它与 numpy 数据有关吗?我听说这可能很棘手。
当您从服务器流式传输 720 字节的帧时,实际上每帧连续发送 730 字节(长度 10 字节 + 数据 720 字节),一帧又一帧。
在客户端中,每个 recv()
读取 16 个字节。因此,您的条件 if len(full_msg)-HEADERSIZE == msglen:
永远不会成立,header 大小为 10,因为 730 不能被 16 整除。
因此您的程序在客户端 while True:
上无限循环。
为客户尝试以下程序。我用虚拟数据进行了测试。
client.py
import socket
import numpy as np
import cv2
import pickle
HEADERSIZE = 10
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 1232))
while True:
msg_length=int(s.recv(HEADERSIZE))
full_msg=b''
while len(full_msg)<msg_length:
full_msg+=s.recv(msg_length-len(full_msg))
print(full_msg)
d = pickle.loads(full_msg)
cv2.namedWindow('Webcam', cv2.WINDOW_NORMAL)
cv2.imshow('Webcam', full_msg)
我正在尝试通过套接字发送 python-opencv 帧。我正在对数据进行 pickle 和 unpickling,但由于某种原因它是空白的或者什么都没有显示。
这是我 运行 client.py
new message length: b'720 '
它应该从服务器流式传输网络摄像头,但没有显示任何内容。
这是我的客户端和服务器代码:
client.py
import socket
import numpy as np
import cv2
import pickle
HEADERSIZE = 10
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 1232))
while True:
full_msg = b''
new_msg = True
while True:
msg = s.recv(16)
if new_msg:
print(f'new message length: {msg[:HEADERSIZE]}')
msglen = int(msg[:HEADERSIZE])
new_msg = False
full_msg += msg
if len(full_msg)-HEADERSIZE == msglen:
print('full msg recvd')
print(full_msg[HEADERSIZE:])
d = pickle.loads(full_msg[HEADERSIZE:])
print(d)
cv2.namedWindow('Webcam', cv2.WINDOW_NORMAL)
cv2.imshow('Webcam', full_msg[HEADERSIZE:])
new_msg = True
full_msg = b''
print(full_msg)
server.py
import socket
import numpy as np
import cv2
import time
import pickle
from signal import signal, SIGPIPE, SIG_DFL
signal(SIGPIPE, SIG_DFL)
HEADERSIZE = 10
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((socket.gethostname(), 1232))
s.listen(5)
cap = cv2.VideoCapture(0)
while True:
clientsocket, address = s.accept()
print(f"Connection from {address} has been established!")
while True:
ret, frame = cap.read()
msg = pickle.dumps(frame)
print(frame)
msg = bytes(f'{len(frame):<{HEADERSIZE}}', "utf-8") + msg
clientsocket.send(msg)
我不知道为什么什么都没有出现。我什至不知道是否有任何事情发生。它与 numpy 数据有关吗?我听说这可能很棘手。
当您从服务器流式传输 720 字节的帧时,实际上每帧连续发送 730 字节(长度 10 字节 + 数据 720 字节),一帧又一帧。
在客户端中,每个 recv()
读取 16 个字节。因此,您的条件 if len(full_msg)-HEADERSIZE == msglen:
永远不会成立,header 大小为 10,因为 730 不能被 16 整除。
因此您的程序在客户端 while True:
上无限循环。
为客户尝试以下程序。我用虚拟数据进行了测试。
client.py
import socket
import numpy as np
import cv2
import pickle
HEADERSIZE = 10
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((socket.gethostname(), 1232))
while True:
msg_length=int(s.recv(HEADERSIZE))
full_msg=b''
while len(full_msg)<msg_length:
full_msg+=s.recv(msg_length-len(full_msg))
print(full_msg)
d = pickle.loads(full_msg)
cv2.namedWindow('Webcam', cv2.WINDOW_NORMAL)
cv2.imshow('Webcam', full_msg)