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)