ConnectionResetError: [WinError 10054]

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
m.g.o.d
User
Beiträge: 47
Registriert: Samstag 4. April 2020, 13:17

Freitag 8. Januar 2021, 21:14

Hallo Zusammen,

ich versuche mich gerade über einen Videostreamer via UDP, der mir aktuell folgenden Fehler ausgibt:
ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host

Ich konnte dazu leider keine hilfreiche Lösung finden und verstehe nicht genau, weshalb dieser Fehler passiert. Mein Server empfängt genau ein Videoframe, danach ist schluss. Die Übertragung ist also unvollständig. Wie immer bin ich für Hinweise super dankbar.:

Client Code:

Code: Alles auswählen

import socket, sys, logging, os
from PyQt5 import QtWidgets, uic
import cv2
import numpy as np
import pickle
import struct

class ClientVideoParser(QtWidgets.QDialog):
    """ load widgets from configuration.ui """
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = uic.loadUi('client_video_parser.ui', self)
        self.ui.setWindowTitle('Client')
        self.writeInFile()
        self.ui.load.clicked.connect(self.clicked_load)

    def clicked_load(self):
        videopath = self.videopath.text() 
        self.newest(videopath)
        
    def newest(self, path):
        """ get the latest video file in videopath """
        files = os.listdir(path)
        paths = [os.path.join(path, basename) for basename in files]
        erg = max(paths, key=os.path.getctime)
        logging.info("file found: "+erg)
        self.videostreamer(erg)
   
    def videostreamer(self, erg):
        """ convert filename into cv2 videoobject and streaming via UDP """     
        try:
            cap = cv2.VideoCapture(erg)
            logging.info("Video object successfully created:" + erg)
            logging.shutdown()
        except Exception as e:
            logging.error("Could not convert file into video: " + erg)
            logging.shutdown()

        try:
            ip_adress = self.ui.ip_adress.text()
            port = int(self.ui.port.text()) 
            clientsocket=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            clientsocket.connect((ip_adress,port))
        except Exception as e:
            logging.error("Creating sockets failed")
            logging.shutdown()

        while cap.isOpened():
            try:
                ret, frame = cap.read()

                # Serialize frame
                data = pickle.dumps(frame)

                # Send message length first
                message_size = struct.pack("L", len(data)) ### CHANGED

                # Then data
                clientsocket.sendall(message_size + data)

            except Exception as e:
                logging.error("streaming video failed")
                logging.shutdown()


    def writeInFile(self):
        logging.basicConfig(
            filename= "client_video_parser.log",
            level= logging.DEBUG,
            style= "{",
            format= "{asctime} [{levelname:8}] {message}",
            datefmt="%d.%m.%Y %H:%M:%S")
        
if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    mainframe = ClientVideoParser()
    mainframe.show()
    sys.exit(app.exec_())
ServerCode:

Code: Alles auswählen

import socket, sys, logging, os
from PyQt5 import QtWidgets, uic
import cv2
import numpy as np
import pickle
import struct

class ClientVideoParser(QtWidgets.QDialog):
    """ load widgets from configuration.ui """
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = uic.loadUi('server_video_parser.ui', self)
        self.ui.setWindowTitle('Server')
        self.ui.open.clicked.connect(self.clicked_open)
        self.writeInFile()

    def clicked_open(self):
        HOST = self.ui.ip_adress.text()
        PORT = int(self.ui.port.text())

        try:
            s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            logging.info("socket created")
            s.bind((HOST, PORT))
            logging.info("socket binded")
            s.listen(10)
            logging.info("socket is listening")

            conn, addr = s.accept()
            data = b'' 
            payload_size = struct.calcsize("L")

            while True:
                # Retrieve message size
                while len(data) < payload_size:
                    data += conn.recv(4096)

                packed_msg_size = data[:payload_size]
                data = data[payload_size:]
                msg_size = struct.unpack("L", packed_msg_size)[0] 

                # Retrieve all data based on message size
                while len(data) < msg_size:
                    data += conn.recv(4096)

                frame_data = data[:msg_size]
                data = data[msg_size:]

                # Extract frame
                frame = pickle.loads(frame_data)

                # Display
                cv2.imshow('frame', frame)
                cv2.waitKey(1)
                print("got frame", frame.shape)

                # Save as file
                try:
                    (grabbed, frame) = frame.read()
                    fshape = frame.shape
                    fheight = fshape[0]
                    fwidth = fshape[1]
                    fourcc = cv2.VideoWriter_fourcc(*'XVID')
                    out = cv2.VideoWriter('output.avi',fourcc, 20.0, (fwidth,fheight))
                    logging.info("Saved file. Height: "+fheight +" width: " + fwidth)
                    logging.shutdown()
                except Exception as e:
                    logging.error("saving file not successfull")
                    logging.shutdown()
        except Exception as e:
            logging.error("Exception while establish connection occurs")
            logging.shutdown()


    def writeInFile(self):
        logging.basicConfig(
            filename= "server_video_parser.log",
            level= logging.DEBUG,
            style= "{",
            format= "{asctime} [{levelname:8}] {message}",
            datefmt="%d.%m.%Y %H:%M:%S")


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    mainframe = ClientVideoParser()
    mainframe.show()
    sys.exit(app.exec_())
Benutzeravatar
__blackjack__
User
Beiträge: 7831
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Freitag 8. Januar 2021, 22:41

@m.g.o.d: Im Beitrag steht UDP im Quelltext ist es TCP — was denn nun? Und der *Server* *empfängt* einen Frame?

Es wird jeder Frame immer als Videofile geschrieben? Und das wird mit jedem Frame überschrieben.

Die Fehlerbehandlung ist schlecht. Wenn man schon eine Ausnahme protokolliert dann doch bitte mit der passenden Logging-Funktion die auch den Traceback mitprotokolliert, denn die Frage wo den diese Aufnahme im Code auftritt ist zur Fehlersuche interessant. Und was sollen diese elendig vielen `logging.shutdown()`-Aufrufe?
“There's also a certain pleasure in actually getting things to work in Java, somewhat like the pleasure, I imagine, of building ships in bottles.”
— David Cook in c.l.p
m.g.o.d
User
Beiträge: 47
Registriert: Samstag 4. April 2020, 13:17

Samstag 9. Januar 2021, 15:28

Ich hab den Fehler bereits eingrenzen können.

Danke für das Feedback, was alles schlecht an meinem Code ist. Vielleicht könntest du mir aber auch schreiben, wie ich den Traceback mitprotokolliert bekomme? Dann hätte ich auch einen Lerneffekt an der Stelle. Herzlichen Dank.
__deets__
User
Beiträge: 9143
Registriert: Mittwoch 14. Oktober 2015, 14:29

Samstag 9. Januar 2021, 15:48

logging.exception()
Antworten