-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathclient.py
65 lines (53 loc) · 1.67 KB
/
client.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
import message
import socket
SERVER_ADDR = ("127.0.0.1", 5000)
def debug(*args):
pass
class MessageStore:
def __init__(self):
self.next_to_print = 0
self.store = {}
def iter_available(self):
while self.next_to_print in self.store:
msg = self.store.pop(self.next_to_print)
yield msg
self.next_to_print += 1
def iter_to_request(self):
if not self.store:
return
last_seen = sorted(self.store.keys())[-1]
for seq in range(self.next_to_print, last_seen):
if seq not in self.store:
yield seq
def store_message(self, msg):
seq = msg[1]
self.store[seq] = msg
def subscribe_to_server(s, addr):
msg = message.encode_message(message.START_TYPE, 0, b"")
debug("Start")
s.sendto(msg, addr)
def request_message(s, addr, seq):
msg = message.encode_message(message.REQ_TYPE, seq, b"")
debug("Request", seq)
s.sendto(msg, addr)
def receive_message(s):
data, address = s.recvfrom(1024)
return message.decode_message(data)
def receive_from_server(s, addr):
msg_store = MessageStore()
next_seq = 0
store = {}
while True:
for msg in msg_store.iter_available():
debug("Display", msg)
payload = msg[2]
print(payload)
for seq in msg_store.iter_to_request():
request_message(s, addr, seq)
msg = receive_message(s)
debug("Store", msg)
msg_store.store_message(msg)
s = socket.socket(socket.AF_INET, # Internet
socket.SOCK_DGRAM) # UDP
subscribe_to_server(s, SERVER_ADDR)
receive_from_server(s, SERVER_ADDR)