Skip to content

Commit e39c85a

Browse files
committed
saves images to file on disk
1 parent 401f5af commit e39c85a

File tree

1 file changed

+73
-26
lines changed

1 file changed

+73
-26
lines changed

Diff for: server.py

+73-26
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#!/usr/bin/env python3
22

33
import io
4+
import os
45
import json
56
import socket
67
import threading
@@ -24,35 +25,72 @@ class Room:
2425
def __init__(self, name="default"):
2526
self.clients = []
2627
self.name = name
27-
self.filename = "/tmp/room_"+name
28-
self.write_handle = open(self.filename, "wb")
28+
self.msgs_file = "/tmp/room_"+name+"_msgs"
29+
self.write_handle = open(self.msgs_file, "wb")
2930
self.image = Image.new("L", (WIDTH, HEIGHT), 255)
31+
self.image_file = "/tmp/room_"+name+"_img"
3032
self.imgdraw = ImageDraw.Draw(self.image)
33+
self.lock = threading.Lock()
34+
35+
if os.path.exists(self.image_file):
36+
self.image = Image.open(self.image_file)
37+
38+
if os.path.exists(self.msgs_file):
39+
with open(self.msgs_file, "rb") as f:
40+
for line in f.readlines():
41+
msg_obj = json.loads(line)
42+
x, y, px, py = (
43+
msg_obj["x"],
44+
msg_obj["y"],
45+
msg_obj["prevx"],
46+
msg_obj["prevy"]
47+
)
48+
self.imgdraw.line(
49+
[(px, py), (x, y)],
50+
fill=msg_obj["color"],
51+
width=msg_obj["width"]
52+
)
53+
3154

3255
def __del__(self):
33-
self.write_handle.close()
56+
with self.lock:
57+
self.write_handle.close()
3458

3559
def add(self, client):
36-
self.clients.append(client)
37-
self.write_handle.flush()
60+
with self.lock:
61+
self.clients.append(client)
62+
self.write_handle.flush()
3863

39-
with open(self.filename, 'rb') as f:
40-
client.conn.sendall(f.read())
64+
with open(self.msgs_file, 'rb') as f:
65+
client.conn.sendall(f.read())
4166

4267
def remove(self, client):
43-
print("Removing connection", client.conn.addr)
44-
self.clients.remove(client)
68+
with self.lock:
69+
print("Removing connection", client.conn.addr)
70+
self.clients.remove(client)
4571

4672
def send(self, msg_str):
47-
for client in self.clients:
48-
try:
49-
client.conn.sendall(msg_str + b'\n')
50-
except:
51-
pass
73+
with self.lock:
74+
for client in self.clients:
75+
try:
76+
client.conn.sendall(msg_str + b'\n')
77+
except:
78+
pass
79+
80+
# make thread safe?
81+
self.write_handle.write(msg_str + b'\n')
82+
self.write_handle.flush()
83+
84+
def clear(self):
85+
with self.lock:
86+
self.image = Image.new("L", (WIDTH, HEIGHT), 255)
87+
self.clear_log()
88+
89+
self.send(b'{"type":"clear"}')
90+
91+
def clear_log(self):
92+
self.write_handle.truncate()
5293

53-
self.write_handle.write(msg_str)
54-
self.write_handle.write(b'\n')
55-
self.write_handle.flush()
5694

5795

5896
_rooms = { "default": Room(name="default")}
@@ -81,7 +119,13 @@ def join(self, room):
81119
# TODO send URL with image download
82120

83121
def handle_message(self, msg_obj):
84-
if msg_obj["type"] == "draw" and self.room:
122+
if msg_obj["type"] == "join":
123+
self.join(msg_obj["room"])
124+
125+
if self.room == None:
126+
return
127+
128+
if msg_obj["type"] == "draw":
85129
x, y, px, py = (
86130
msg_obj["x"],
87131
msg_obj["y"],
@@ -97,8 +141,9 @@ def handle_message(self, msg_obj):
97141
msg_str = bytes(json.dumps(msg_obj), encoding='utf8')
98142
with room_lock:
99143
_rooms[self.room].send(msg_str)
100-
elif msg_obj["type"] == "join":
101-
self.join(msg_obj["room"])
144+
elif msg_obj["type"] == "clear":
145+
with room_lock:
146+
_rooms[self.room].clear()
102147

103148
def run(self):
104149
# self.csocket.send(bytes("Hi, This is from Server..",'utf-8'))
@@ -124,10 +169,7 @@ def run(self):
124169
message = b""
125170

126171
for msg_obj in messages:
127-
try:
128-
self.handle_message(msg_obj)
129-
except Exception as e:
130-
print("EXC", msg_obj, e)
172+
self.handle_message(msg_obj)
131173

132174
messages = []
133175
self.conn.close()
@@ -141,8 +183,13 @@ def get_room_image(room):
141183
with room_lock:
142184
if room not in _rooms:
143185
return "room not found"
144-
im = _rooms[room].image
145-
im.save(s, format="png")
186+
room = _rooms[room]
187+
188+
with room.lock:
189+
im = room.image
190+
im.save(room.image_file, format="png")
191+
im.save(s, format="png")
192+
room.clear_log()
146193
bytes = s.getvalue()
147194
return bytes
148195

0 commit comments

Comments
 (0)