import socket
import multiprocessing
import igl
import array

HOST = 'localhost'                 # Symbolic name meaning all available interfaces
PORT = 50008              # Arbitrary non-privileged port

def worker(data):
    viewer = igl.viewer.Viewer()
    temp = list(data)
    viewer.deserialize(temp)
    viewer.launch(True,False)
    return

class TCPViewer(igl.viewer.Viewer):
    def launch(self):
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        s.connect((HOST, PORT))
        a = array.array('u',self.serialize())
        s.sendall(a)
        s.close()

if __name__ == "__main__": # The main script is a server
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.bind((HOST, PORT))
    s.listen(1)
    print("TCP iglviewer server listening on port " + str(PORT))
    try:
        while True:
            conn, addr = s.accept()
            slist = []
            while True:
                buf = conn.recv(4096)
                if not buf:
                    break
                slist.append(buf.decode('unicode_internal','ignore'))
            conn.close()

            data = ''.join(slist)

            t = multiprocessing.Process(target=worker, args=(data,))
            t.start()
    except:
        s.close()