diff --git a/MV3500Cohort2021JulySeptember/homework1/Lentz_Python/client.py b/MV3500Cohort2021JulySeptember/homework1/Lentz_Python/client.py
new file mode 100644
index 0000000000000000000000000000000000000000..3bf853c4108b45a77639d375d7d5db0296124415
--- /dev/null
+++ b/MV3500Cohort2021JulySeptember/homework1/Lentz_Python/client.py
@@ -0,0 +1,80 @@
+#Adapted from https://github.com/realpython/materials/blob/master/multiconn-client.py
+import sys
+import socket
+import selectors
+import types
+import contextlib
+import os
+
+with contextlib.suppress(FileNotFoundError):
+    os.remove('screenshot.png')
+
+sel = selectors.DefaultSelector()
+
+def start_connections(host, port, x3d_id):
+    server_addr = (host, port)
+    print("starting connection to", server_addr)
+    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+    sock.setblocking(False)
+    sock.connect_ex(server_addr)
+    events = selectors.EVENT_READ | selectors.EVENT_WRITE
+    data = types.SimpleNamespace(
+        connid=1,
+        msg_total=sum([1]),
+        recv_total=0,
+        messages=[str(x3d_id).encode()],
+        outb=b"",
+    )
+    sel.register(sock, 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
+        sock.settimeout(None)
+        if not recv_data:
+            print("closing connection", data.connid)
+            sel.unregister(sock)
+            sock.close()
+        if recv_data:
+            with open('screenshot.png','ab') as b:
+                b.write(recv_data)
+            data.recv_total += len(recv_data)
+            print("received " + str(data.recv_total)  +  " image bytes from connection", data.connid)
+
+        
+                
+
+    if mask & selectors.EVENT_WRITE:
+        if not data.outb and data.messages:
+            data.outb = data.messages.pop(0)
+        if data.outb:
+            print("sending", repr(data.outb), "to connection", data.connid)
+            sent = sock.send(data.outb)  # Should be ready to write
+            data.outb = data.outb[sent:]
+
+
+if len(sys.argv) != 4:
+    print("This program simulates the agent communicate process where a client requests a dynamically rendered X3D asset from the host.")
+    print("usage:", sys.argv[0], "<host 192.168.86.225> <port 65500> <x3d asset number [0-14138] >")
+    sys.exit(1)
+
+host, port, x3d_id = sys.argv[1:4]
+start_connections(host, int(port), int(x3d_id))
+
+try:
+    while True:
+        events = sel.select(timeout=1)
+        if events:
+            for key, mask in events:
+                service_connection(key, mask)
+        # Check for a socket being monitored to continue.
+        if not sel.get_map():
+            break
+except KeyboardInterrupt:
+    print("caught keyboard interrupt, exiting")
+finally:
+    sel.close()
+sel.close()
\ No newline at end of file