import socket import queue import time import cv2 from imshow import network from imshow import wrap from imshow import config from imshow import parallel SocketServer = network.SocketServer SocketMessage = network.SocketMessage SocketConnection = network.SocketConnection class ImageServer(): def __init__(self, ip, port): self.server = SocketServer(ip=ip, port=port, message_handler=self.process_socket) self.server.start() self.id = 0 self.finished_id = [] self.imgs = queue.Queue() def process_socket(self, clientsocket, addr): connection = SocketConnection(self.server.daemon, '[{0}]'.format(str(addr))) connection.log('Connection extablished from {0}'.format(addr)) connection.SetSock(clientsocket) connection.log('Waiting for authentication...', level=1) connection.WaitAuth(config.token) while True: message = connection.recv() if message is None: break img = wrap.ImageMessage() img.frombytes(message) task = {} task['img'] = img.img task['name'] = img.name task['wait'] = img.wait task['id'] = self.id task['source'] = addr self.imgs.put(task) self.id += 1 connection.log('waiting for showing image') while task['id'] not in self.finished_id: time.sleep(0.01) continue connection.log('image shown!') if not connection.send('continue'.encode('utf-8')): connection.log('Exited') break connection.log('client {0} disconnected'.format(addr)) def show(self): while True: task = None try: task = self.imgs.get(timeout=0.1) except queue.Empty: cv2.waitKey(1) continue img = task['img'] name = task['name'] wait = task['wait'] cv2.imshow(name, img) cv2.waitKey(wait) self.finished_id.append(task['id']) if __name__ == '__main__': server = ImageServer('0.0.0.0', 12345) server.show()