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