From e7e2ea43c5d846eb79aa7e83e0a44d0d2d5d2266 Mon Sep 17 00:00:00 2001 From: "Lentz, Rick" <rick.w.lentz.civ@mail.mil> Date: Fri, 13 Aug 2021 13:52:16 -0700 Subject: [PATCH] Upload New File --- .../homework1/Lentz_Python/server.py | 70 +++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 MV3500Cohort2021JulySeptember/homework1/Lentz_Python/server.py diff --git a/MV3500Cohort2021JulySeptember/homework1/Lentz_Python/server.py b/MV3500Cohort2021JulySeptember/homework1/Lentz_Python/server.py new file mode 100644 index 0000000000..260a999e6a --- /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 -- GitLab