# -*- coding: utf-8 -*- from socket import * import threading import cv2 import struct import pickle import zlib class Video_Client(threading.Thread): def __init__(self, HOST, PORT): threading.Thread.__init__(self) print('video clinet start') self.setDaemon(True) self.ADDR = (HOST, PORT) self.sock = socket(AF_INET, SOCK_STREAM) def __del__(self): self.sock.close() try: cv2.destroyAllWindows() except: pass def run(self): self.sock.connect_ex(self.ADDR) print("video client connected...") data = "".encode("utf-8") payload_size = struct.calcsize("L") cv2.namedWindow('Remote', cv2.WINDOW_NORMAL) while True: try: while len(data) < payload_size: data += self.sock.recv(81920) packed_size = data[:payload_size] data = data[payload_size:] msg_size = struct.unpack("L", packed_size)[0] while len(data) < msg_size: data += self.sock.recv(81920) zframe_data = data[:msg_size] data = data[msg_size:] frame_data = zlib.decompress(zframe_data) frame = pickle.loads(frame_data) try: cv2.imshow('Remote', frame) key = cv2.waitKey(10) if key == ord('q'): print('client exit') cv2.destroyAllWindows() self.sock.close() except: print('video server error') cv2.destroyAllWindows() self.sock.close() except: self.sock.close() try: cv2.destroyAllWindows() except: pass print('server close') break