-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathserver.py
117 lines (98 loc) · 3.75 KB
/
server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import socket
import signal
from logger import Logger
import json
from threading import Thread
from time import sleep, time
cursors = []
Logger.disable()
def _404():
return {
"status" : 404,
"body": {
"message": "Not found"
}
}
def _200(body={}):
return {
"status" : 200,
"body": body
}
class Server:
def __init__(self, host, port):
self.host = host
self.port = port
self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0)
self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
self.sock.bind((self.host, self.port))
self.logger = Logger("[Server]")
self.logger.log(f"Listening on {self.host}:{self.port}...")
self.sock.listen(5)
def listen(self):
while True:
conn, addr = self.sock.accept()
self.logger.log(f"Connection from {addr}")
Thread(target=self.handle, args=(conn, addr)).start()
def handle(self, conn, addr):
logger = Logger(f"[{addr[0]}:{str(addr[1])}]")
logger.log("Connected")
with conn:
while True:
try:
data = conn.recv(1024)
except:
logger.warn("Exception while receiving data (Unexpected disconnect?)")
self.disconnect(conn, addr, logger)
break
if not data:
self.disconnect(conn, addr, logger)
break
try:
data = data.decode()
data = json.loads(data)
logger.log(f"Received: {data}")
match data["method"]:
case "POST":
match data["body"]["id"]:
case "register":
cursors.append({
"id": addr,
"name": data["body"]["name"],
"position": data["body"]["position"]
})
response = _200()
print(cursors)
case "move":
for cursor in cursors:
if cursor["id"] == addr:
cursor["position"] = data["body"]["position"]
break
response = _200()
case _:
response = _404()
case "GET":
match data["body"]["id"]:
case "positions":
response = _200({"cursors": cursors})
case _:
response = _404()
case _:
response = _404()
conn.sendall(json.dumps(response).encode())
logger.log(f"Sent: {response}")
except Exception as e:
logger.error(f"Error: {e}")
break
def disconnect(self, conn, addr, logger):
for cursor in cursors:
if cursor["id"] == addr:
cursors.remove(cursor)
logger.log("Disconnected")
break
if __name__ == "__main__":
signal.signal(signal.SIGINT, signal.SIG_DFL)
server = Server("0.0.0.0", 5000)
def sendCursor():
while True:
sleep(.1)
server.listen()