73 lines
1.8 KiB
Python
73 lines
1.8 KiB
Python
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()
|