Total Complexity | 9 |
Total Lines | 57 |
Duplicated Lines | 0 % |
Changes | 0 |
1 | import errno |
||
2 | import sys |
||
3 | import uuid |
||
4 | |||
5 | HEADER_LENGTH = 10 |
||
6 | |||
7 | |||
8 | class Client: |
||
9 | |||
10 | def __init__(self, client_socket): |
||
11 | self.name = f"client {uuid.uuid4()}".encode("utf-8") |
||
12 | self.socket = client_socket |
||
13 | |||
14 | username_header = f"{len(self.name) : <{HEADER_LENGTH}}".encode("utf-8") |
||
15 | self.socket.send(username_header + self.name) |
||
16 | |||
17 | self.send_message = '' |
||
18 | |||
19 | def send(self): |
||
20 | message = self.send_message.encode("utf-8") |
||
21 | message_header = f"{len(message) :< {HEADER_LENGTH}}".encode("utf-8") |
||
22 | self.socket.send(message_header + message) |
||
23 | self.send_message = '' |
||
24 | |||
25 | def retrieve_next_message(self, new_messages): |
||
26 | username_header = self.socket.recv(HEADER_LENGTH) |
||
27 | if not len(username_header): |
||
28 | print("Connection closed by the server") |
||
29 | sys.exit() |
||
30 | |||
31 | username_length = int(username_header.decode("utf-8").strip()) |
||
32 | username = self.socket.recv(username_length).decode("utf-8") |
||
33 | |||
34 | message_header = self.socket.recv(HEADER_LENGTH) |
||
35 | message_length = int(message_header.decode("utf-8").strip()) |
||
36 | message = self.socket.recv(message_length).decode("utf-8") |
||
37 | |||
38 | new_messages.append({'author': username, 'content': message}) |
||
39 | |||
40 | def fetch_new_messages(self): |
||
41 | new_messages = [] |
||
42 | |||
43 | try: |
||
44 | while True: |
||
45 | self.retrieve_next_message(new_messages) |
||
46 | |||
47 | except IOError as e: |
||
48 | if e.errno not in [errno.EAGAIN, errno.EWOULDBLOCK]: |
||
49 | print("reading error", str(e)) |
||
50 | sys.exit() |
||
51 | |||
52 | return new_messages |
||
53 | |||
54 | except Exception as e: |
||
55 | print("general error", str(e)) |
||
56 | sys.exit() |
||
57 |