Как определить, отключен ли клиент сокета python от сервера сокета python - PullRequest
0 голосов
/ 08 марта 2020

Я установил здесь простой клиент-сервер видеопотока. Клиент отправит видео канал на сервер. Когда я закрываю сокет сервера, клиентский сокет прекращает отправку видеопотока и закрывает клиентский сокет, но проблема возникает, когда я закрываю клиент. Когда я закрываю сокет клиента, сокет сервера все равно показывает последнее изображение, отправленное сокетом клиента, а сокет сервера просто висит там. Я приложил код клиента и сервера.

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();



Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...