diff --git a/Server_127.0.0.1_Startet_Election.py b/Server_127.0.0.1_Startet_Election.py new file mode 100644 index 0000000000000000000000000000000000000000..e1fe8d02acdf27f360a8e68873633d2c148744e2 --- /dev/null +++ b/Server_127.0.0.1_Startet_Election.py @@ -0,0 +1,117 @@ + +#Test Communication UDP between 2 +import socket +from uuid import uuid4 +import uuid + +ELECTION = 0 +NEW_LEAD = 1 +my_ip = '127.0.0.1' +election_socket = 12345 +myuuid = uuid.uuid4() #UUid auch als String vergleichbar? +participating = False +is_leader = False +Leader = False +print(myuuid) + +#Nachbar des Servers im Ring wird ermittelt - an diesen wird später die Election Message gesendet Achtung wieso ist beim letzenm der partner nicht der erste?? +def get_neighbour(members, current_member_ip, direction='left'): + current_member_index = members.index(current_member_ip) if current_member_ip in members else -1 + if current_member_index != -1: + if direction == 'left': + if current_member_index + 1 == len(members): + return members[0] + else: + return members[current_member_index + 1] + else: + if current_member_index - 1 < 0: + return members[len(members) - 1] + else: + return members[current_member_index - 1] + else: + return None + +members = ['127.0.0.1', '127.0.0.2', '127.0.0.5'] +neighbour = get_neighbour(members, my_ip , 'right') +print(neighbour) + +#Funktion muss aufgerufen werden! +def start_election(): + print("{} is starting an election.".format(myuuid)) + #Server nimmt an Election Teil + participating = True + #Nachricht wird an den Server neben an gesendet + msg = f"{ELECTION}: {myuuid}".encode('utf-8') + #Msg encoden? Variable setzen? + send_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) + send_socket.sendto(msg,(neighbour,election_socket)) + #data,addr=send_socket.recvfrom(4096) + #Was passiert wenn diese Nachricht nicht ankommt? + send_socket.close() + + + +def accept(group,erhaltene_uuid): + if group == ELECTION: + #Abgleich der erhaltenen Uuid mit der eigenen uuid + if erhaltene_uuid > myuuid: + print("{} is forwarding without updates.".format(myuuid)) + participating = True + msg = f"{ELECTION}: {erhaltene_uuid}".encode() + #Weitergabe der höheren uuid + send_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) + send_socket.sendto(msg,(neighbour,election_socket)) + #Was passiert wenn diese Nachricht nicht ankommt? + send_socket.close() + if erhaltene_uuid < myuuid: + print("{} is updating and forwarding.".format(myuuid)) + participating = True + msg = f"{ELECTION}: {myuuid}".encode() + #Weitergabe der höheren uuid + send_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) + send_socket.sendto(msg,(neighbour,election_socket)) + #Was passiert wenn diese Nachricht nicht ankommt? + send_socket.close() + if erhaltene_uuid == myuuid: + print("{} starts acting as a leader!".format(myuuid)) + participating = False + is_leader = True + leader = myuuid + msg = f"{NEW_LEAD}: {myuuid}".encode() + #Weitergabe der höheren uuid + send_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) + send_socket.sendto(msg,(neighbour,election_socket)) + #Was passiert wenn diese Nachricht nicht ankommt? + send_socket.close() + if group == NEW_LEAD: + if erhaltene_uuid == myuuid: + return + if erhaltene_uuid != myuuid: + print("{} acknowledged new leader.".format(myuuid)) + leader = myuuid + msg = f"{NEW_LEAD}: {erhaltene_uuid}".encode() + #Weitergabe der höheren uuid + send_socket=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) + send_socket.sendto(msg,(neighbour,election_socket)) + #Was passiert wenn diese Nachricht nicht ankommt? + send_socket.close() + + +#zuhören +start_election() +sock = socket.socket(socket.AF_INET,socket.SOCK_DGRAM) +sock.bind((my_ip,election_socket)) +while True: + data,addr=sock.recvfrom(4096) + übernahme = data.decode('utf-8') + #message = ("Hello i am server").encode('utf-8') + #Für Piggiback Acn nutzen? + #sock.sendto(message,addr) + grouprec = int(übernahme.split(": ")[0]) + #print(übernahme) + #print((übernahme.split(": ")[1])) + erhaltene_uuid2 = uuid.UUID((übernahme.split(": ")[1])) + accept(grouprec,erhaltene_uuid2) + + +