ImshowOverSocket/imshow/server.py
2019-12-28 16:26:19 +08:00

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