-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpc.py
More file actions
95 lines (75 loc) · 4.23 KB
/
Copy pathpc.py
File metadata and controls
95 lines (75 loc) · 4.23 KB
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
from roteamento import Roteamento
from socket import socket, AF_INET, SOCK_DGRAM
roteamento = Roteamento()
class Pc:
def __init__(self, pc, porta):
self.pc = pc
self.porta = porta
self.client_socket = socket(AF_INET, SOCK_DGRAM)
self.server_socket = socket(AF_INET, SOCK_DGRAM)
# Função para que o nó possa se registrar na autoridade assim que o programa for instanciado
def register(self):
server_address = ('localhost', 7777) # endereço e porta da autoridade
request = f'register:{self.pc}'
self.client_socket.sendto(request.encode(), server_address)
print('Registrando o nó na autoridade...')
print('Nó registrado com sucesso!')
# Função para receber mensagens de outros PCs
def server_function(self, porta):
# associar socket a endereço e porta
self.server_socket.bind(("localhost", porta))
# Loop para receber mensagens dos outros PCs
while True:
message, clientAddress = self.server_socket.recvfrom(2048)
request = message.decode()
# Se a mensagem iniciar com a tag RRRR ela foi roteada, se iniciar com BBBB é broadcast
if request[0:4] == 'RRRR' or request[0:4] == 'BBBB':
_, pc_origem, pc_destino, msg = request.split(':')
# Verifica se a mensagem é para o PC atual
if self.pc == int(pc_destino):
if request[0:4] == 'BBBB':
ans = f'{self.pc} recebeu a mensagem roteada'
print(f"A mensagem recebida foi: {msg}")
ans = f'RRRR:{self.pc}:{int(msg[2])}:PC{self.pc} recebeu a mensagem broadcast'
destino = roteamento.enviar_mensagens(self.pc, int(msg[2]))
destino = ('localhost', int(str(destino)*4))
self.server_socket.sendto(ans.encode(), destino)
else:
print(f"A mensagem recebida foi: {msg}")
# Se não for, roteia a mensagem para o próximo PC
else:
pc_origem = self.pc
prox_pc = roteamento.enviar_mensagens(pc_origem, int(pc_destino))
destino = ('localhost', int(str(prox_pc)*4))
self.client_socket.sendto(request.encode(), destino)
else:
print(f"A mensagem recebida foi: {request}")
# Função para enviar mensagens para outros PCs
def client_function(self):
iniciar = input('Digite enter para iniciar a comunicação entre os PCs\n')
# primeiro loop para enviar mensagens para todos os PCs
for i in range(6):
destino = int(str(i+1)*4)
if destino == self.porta:
continue
destino = ('localhost', destino)
# Condicionais para determinar o destino adequado dos pacotes
if (self.pc == 1 and (i+1) == 6) or (self.pc == 6 and (i+1) == 1):
# segundo loop para enviar 5 mensagens para cada PC
for j in range(5):
message = f"PC{self.pc} aqui! Mensagem {j+1} para o PC {i+1}"
self.client_socket.sendto(message.encode(), destino)
elif (i+1) == self.pc+1 or (i+1) == self.pc-1:
for j in range(5):
message = f"PC{str(self.porta)[0]} aqui! Mensagem {j+1} para o PC {i+1}"
# enviamos a mensagem pelo socket criado
self.client_socket.sendto(message.encode(), destino)
else:
prox_pc = roteamento.enviar_mensagens(self.pc, i+1)
destino = ('localhost', int(str(prox_pc)*4))
for j in range(5):
# Usa a função de roteamento para determinar o próximo PC
message = f'RRRR:{self.pc}:{i+1}:PC{self.pc} aqui! Mensagem {j+1} roteada para o PC {i+1}'
self.client_socket.sendto(message.encode(), destino)
mensagem_broadcast = f"BBBB:{self.pc}:{i+1}:PC{self.pc} aqui! Mensagem broadcast para todos os PCs"
self.client_socket.sendto(mensagem_broadcast.encode(), destino)