Passed
Push — main ( e5d7db...d12e93 )
by Yohann
56s
created

core.receive_message()   A

Complexity

Conditions 3

Size

Total Lines 15
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 12
dl 0
loc 15
rs 9.8
c 0
b 0
f 0
cc 3
nop 1
1
import select
2
import socket
3
4
HEADER_LENGTH = 10
5
6
7
def receive_message(client_socket_):
8
    try:
9
        message_header = client_socket_.recv(HEADER_LENGTH)
10
        if not len(message_header):
11
            return False
12
13
        message_length = int(message_header.decode('utf-8').strip())
14
        return {
15
            "header": message_header,
16
            "data": client_socket_.recv(message_length)
17
        }
18
19
    except Exception as e:
20
        print(e)
21
        return False
22
23
24
def start(ip, port):
25
    server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
26
    server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
27
28
    server_socket.bind((ip, port))
29
    server_socket.listen()
30
31
    print("server started")
32
    socket_list = [server_socket]
33
    clients = {}
34
35
    while True:
36
        run_cycle(server_socket, socket_list, clients)
37
38
39
def run_cycle(server_socket, socket_list, clients):
40
    read_sockets, _, exception_sockets = select.select(
41
        socket_list, [], socket_list
42
    )
43
44
    for notified_socket in read_sockets:
45
        if notified_socket == server_socket:
46
            client_socket, client_address = server_socket.accept()
47
48
            user = receive_message(client_socket)
49
50
            if not user:
51
                continue
52
53
            socket_list.append(client_socket)
54
            clients[client_socket] = user
55
56
            print(
57
                f"Accepted new connection from {client_address[0]}:"
58
                f"{client_address[1]} username: {user['data'].decode('utf-8')}"
59
            )
60
61
        else:
62
            message = receive_message(notified_socket)
63
64
            if not message:
65
                print(
66
                    "Closed connection from",
67
                    clients[notified_socket]['data'].decode('utf-8')
68
                )
69
70
                socket_list.remove(notified_socket)
71
                del clients[notified_socket]
72
                continue
73
74
            user = clients[notified_socket]
75
            print(
76
                f"receive_message from {user['data'].decode('utf-8')}:",
77
                message['data'].decode('utf-8')
78
            )
79
80
            for client_socket in clients:
81
                if client_socket != notified_socket:
82
                    client_socket.send(
83
                        (
84
                            user["header"] + user["data"]
85
                            + message['header'] + message["data"]
86
                        )
87
                    )
88
89
    for notified_socket in exception_sockets:
90
        socket_list.remove(notified_socket)
91
        del clients[notified_socket]
92