Я установил здесь простой клиент-сервер видеопотока. Клиент отправит видео канал на сервер. Когда я закрываю сокет сервера, клиентский сокет прекращает отправку видеопотока и закрывает клиентский сокет, но проблема возникает, когда я закрываю клиент. Когда я закрываю сокет клиента, сокет сервера все равно показывает последнее изображение, отправленное сокетом клиента, а сокет сервера просто висит там. Я приложил код клиента и сервера.
client.py
import numpy as np
import socket
import pickle
import struct
cap = cv.VideoCapture(0);
#client socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
s.connect(("localhost",5000));
while True:
ret, frame = cap.read();
#change the frame into byte form
data = pickle.dumps(frame);
#pack the unsigned long and size of data in front of the data
#then add the data behind
try:
s.sendall(struct.pack("L", len(data))+data);
except:
break;
cv.imshow("OriCam",frame);
key = cv.waitKey(1);
if key==ord("q"):
break;
cv.destroyAllWindows();
cap.release();
s.shutdown(socket.SHUT_RDWR);
s.close();
server.py
import cv2 as cv
import numpy as np
import socket
import pickle
import struct
HOST = "localhost"
PORT=5000
#server socket
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);
print("Socket created");
s.bind((HOST,PORT));
print("Socket binded");
s.listen(10);
print("Socket listening");
con, add = s.accept();
print(con);
print(add);
data = b"";
#unsigned long size (4 bytes)
payloadsize = struct.calcsize("L");
while True:
#Retrieve everything
while len(data)<payloadsize:
data += con.recv(2**20);
#find the packed message size, which is the front part of the real data
#and then find the length of data into data
packed_msg_size = data[:payloadsize];
data = data[payloadsize:];
msg_size = struct.unpack("L",packed_msg_size)[0];
#make sure all data are received
while len(data) < msg_size:
data += con.recv(2**20);
data = data[msg_size:];
frame_data = data[:msg_size];
frame=pickle.loads(frame_data);
#frame = pickle.loads(data);
cv.imshow('frame',frame);
key = cv.waitKey(1);
if key==ord("q"):
break;
cv.destroyAllWindows();
s.shutdown(socket.SHUT_RDWR);
s.close();