diff --git a/MV3500Cohort2021JulySeptember/homework1/Lentz_Python/server.py b/MV3500Cohort2021JulySeptember/homework1/Lentz_Python/server.py new file mode 100644 index 0000000000000000000000000000000000000000..260a999e6ad95e668564e790573db6d6c9ae30de --- /dev/null +++ b/MV3500Cohort2021JulySeptember/homework1/Lentz_Python/server.py @@ -0,0 +1,70 @@ +#Adapted from https://github.com/realpython/materials/blob/master/multiconn-client.py + +import sys +import socket +import selectors +import types +import subprocess +import time + +sel = selectors.DefaultSelector() + + +def accept_wrapper(sock): + conn, addr = sock.accept() # Should be ready to read + print("accepted connection from", addr) + conn.setblocking(False) + data = types.SimpleNamespace(addr=addr, inb=b"", outb=b"") + events = selectors.EVENT_READ | selectors.EVENT_WRITE + sel.register(conn, events, data=data) + + +def service_connection(key, mask): + sock = key.fileobj + data = key.data + if mask & selectors.EVENT_READ: + recv_data = sock.recv(1024) # Should be ready to read + if recv_data: + data.outb += recv_data + else: + print("closing connection to", data.addr) + sel.unregister(sock) + sock.close() + if mask & selectors.EVENT_WRITE: + if data.outb: + fn = data.outb.decode('ascii')+'.x3d' + print( "getting " + fn ) + subprocess.run(["wget", "https://nps.edu/x3d_repository/"+fn,"-O","x3d.x3d"]) + subprocess.run(["/castle_game_engine/bin/view3dscene", "--screenshot","0","screenshot.png","x3d.x3d"]) + png_bytes = open('screenshot.png','rb').read() + print("sending png of length " + str(len(png_bytes)) + ' to ', data.addr) + sent = sock.send(png_bytes) # Should be ready to write + data.outb = png_bytes[sent:] + #time.sleep(5) + #subprocess.run(["rm", "screenshot.png","x3d.x3d"]) + + +if len(sys.argv) != 3: + print("usage:", sys.argv[0], "<host> <port>") + sys.exit(1) + +host, port = sys.argv[1], int(sys.argv[2]) +lsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) +lsock.bind((host, port)) +lsock.listen() +print("listening on", (host, port)) +lsock.setblocking(False) +sel.register(lsock, selectors.EVENT_READ, data=None) + +try: + while True: + events = sel.select(timeout=None) + for key, mask in events: + if key.data is None: + accept_wrapper(key.fileobj) + else: + service_connection(key, mask) +except KeyboardInterrupt: + print("caught keyboard interrupt, exiting") +finally: + sel.close() \ No newline at end of file