Пример #1
0
def recv_message():
    global flaga_rozlaczenia
    global numer_sekwencyjny
    while True:
        if flaga_rozlaczenia == False:
            while True:
                recv_m1 = protocol.decode_message(client.recvfrom(1024)[0].decode("utf-8"))

                if int(recv_m1["nr_sekwencyjny"])>1 and recv_m1["operacja"] != "DISCONNECT":
                    recv_m2 = protocol.decode_message(client.recvfrom(1024)[0].decode("utf-8"))

                    if int(recv_m2["nr_sekwencyjny"])>1:
                        recv_m3 = protocol.decode_message(client.recvfrom(1024)[0].decode("utf-8"))
                        print("[ " + str(recv_m3["id"]) + " ]> " + str(recv_m3["data"]))

                        numer_sekwencyjny = 1
                        pakiet_ack = protocol.encode_messsage_Operacja(time.ctime(time.time()), "ACK", numer_sekwencyjny, client_ID).encode("utf-8") # Utworzenie pakietu ACK
                        client.sendto(pakiet_ack, dstHost) # ACK SEND

                elif int(recv_m1["nr_sekwencyjny"])>1 and recv_m1["operacja"] == "DISCONNECT":
                    recv_m2 = protocol.decode_message(client.recvfrom(1024)[0].decode("utf-8"))

                    numer_sekwencyjny = 1
                    pakiet_ack = protocol.encode_messsage_Operacja(time.ctime(time.time()), "ACK", numer_sekwencyjny, client_ID).encode("utf-8") # Utworzenie pakietu ACK
                    client.sendto(pakiet_ack, dstHost) # Wysłanie ACK na DISCONNCONNECTED
                    
                    flaga_rozlaczenia = True
                    print("Partner sie rozlaczyl")
                    return 0
def info(addr,addr_partnera):
    if len(tablica_klientow)>=2:
        numer_sekwencyjny = 2
        sock.sendto(protocol.encode_messsage_Operacja(time.ctime(time.time()), "INFO", numer_sekwencyjny,tablica_klientow[addr_partnera].id).encode("utf-8"),tablica_klientow[addr].adres_surowy)
        numer_sekwencyjny = 1
        sock.sendto(protocol.encode_messsage_Status(time.ctime(time.time()), "INVITATIONS_ACTIVE", numer_sekwencyjny, tablica_klientow[addr_partnera].id).encode("utf-8"),tablica_klientow[addr].adres_surowy)
        client_data, client_address = sock.recvfrom(1024)# ACK RECV
Пример #3
0
def send_invite_denied():
    numer_sekwencyjny = 2
    client.sendto(protocol.encode_messsage_Operacja(time.ctime(time.time()), "INVITE", numer_sekwencyjny, client_ID).encode('utf-8'), dstHost)
    numer_sekwencyjny -= 1
    client.sendto(protocol.encode_messsage_Status(time.ctime(time.time()), "DENY", numer_sekwencyjny, client_ID).encode(('utf-8')),dstHost)

    received_message2 = protocol.decode_message(client.recvfrom(1024)[0].decode("utf-8"))# ACK RECV
    print("Wyslano odmowe")
def send_invite_denied(adres_surowy):
    numer_sekwencyjny = 2
    sock.sendto(protocol.encode_messsage_Operacja(time.ctime(time.time()), "INVITE", numer_sekwencyjny, 1).encode('utf-8'),adres_surowy)
    numer_sekwencyjny = 1
    sock.sendto(protocol.encode_messsage_Status(time.ctime(time.time()), "DENY", numer_sekwencyjny, 1).encode(('utf-8')),adres_surowy)

    received_message2 = protocol.decode_message(sock.recvfrom(1024)[0].decode("utf-8"))# ACK
    print("[SERWER] Wyslano odmowe")
Пример #5
0
def send_data(message):
    numer_sekwencyjny = 3
    client.sendto(protocol.encode_messsage_Operacja(time.ctime(time.time()), "COMMUNICATE", numer_sekwencyjny, client_ID).encode('utf-8'), dstHost)
    #print("wysylam COMMUNICATE")
    numer_sekwencyjny -= 1
    client.sendto(protocol.encode_messsage_Status(time.ctime(time.time()), "SENT", numer_sekwencyjny, client_ID).encode(('utf-8')),dstHost)
    #print("wysylam SENT")
    numer_sekwencyjny -= 1
    client.sendto(protocol.encode_messsage_Dane(time.ctime(time.time()),numer_sekwencyjny, client_ID, message).encode(('utf-8')),dstHost)
Пример #6
0
def close_connection():
    print("Proba rozlaczenia: disconnect")
    numer_sekwencyjny = 2
    client.sendto(protocol.encode_messsage_Operacja(time.ctime(time.time()), "DISCONNECT", numer_sekwencyjny, client_ID).encode('utf-8'), dstHost)
    numer_sekwencyjny -= 1
    client.sendto(protocol.encode_messsage_Status(time.ctime(time.time()), "REQUEST", numer_sekwencyjny, client_ID).encode('utf-8'), dstHost)

    received_message1 = protocol.decode_message(client.recvfrom(1024)[0].decode("utf-8"))# ACK RECV
    print("Polaczenie rozwiazane!")
def wyslij_do_sesji(sock, adr_klienta, client_data):
    sesja = tablica_klientow[adr_klienta].nr_sesji
    for k in tablica_klientow:
        if tablica_klientow[k].nr_sesji == sesja and tablica_klientow[k].id != tablica_klientow[adr_klienta].id:
            numer_sekwencyjny = 3
            sock.sendto(protocol.encode_messsage_Operacja(time.ctime(time.time()), "COMMUNICATE", numer_sekwencyjny, tablica_klientow[adr_klienta].id).encode("utf-8"),tablica_klientow[k].adres_surowy)
            
            numer_sekwencyjny = 2
            sock.sendto(protocol.encode_messsage_Status(time.ctime(time.time()), "SENT", numer_sekwencyjny, tablica_klientow[adr_klienta].id).encode("utf-8"),tablica_klientow[k].adres_surowy)
           
            numer_sekwencyjny = 1
            sock.sendto(client_data, tablica_klientow[k].adres_surowy)
           
            received_ack = protocol.decode_message(sock.recvfrom(1024)[0].decode("utf-8"))# ACK
Пример #8
0
def czy_zaproszenie():
    global flaga_otrzymania_invite
    global flaga_wyslania_invite 
    global wiadomosc_temp
    while True:
        if flaga_wyslania_invite == True:
            return 0
        else:
            try:
                recv_data = protocol.decode_message(client.recvfrom(1024)[0].decode("utf-8"))
                print("Otrzymano INVITE od Klienta {}".format(recv_data["id"]))
                client.sendto(protocol.encode_messsage_Operacja(time.ctime(time.time()), "ACK", numer_sekwencyjny , client_ID).encode("utf-8"), dstHost)
                wiadomosc_temp = recv_data
                flaga_otrzymania_invite = True
                return 0
            except:
                continue
Пример #9
0
    client.sendto(protocol.encode_messsage_Operacja(time.ctime(time.time()), "COMMUNICATE", numer_sekwencyjny, client_ID).encode('utf-8'), dstHost)
    #print("wysylam COMMUNICATE")
    numer_sekwencyjny -= 1
    client.sendto(protocol.encode_messsage_Status(time.ctime(time.time()), "SENT", numer_sekwencyjny, client_ID).encode(('utf-8')),dstHost)
    #print("wysylam SENT")
    numer_sekwencyjny -= 1
    client.sendto(protocol.encode_messsage_Dane(time.ctime(time.time()),numer_sekwencyjny, client_ID, message).encode(('utf-8')),dstHost)
    #print("wysylam wiadomosc : {}".format(message))
    #received_message2 = protocol.decode_message(client.recvfrom(1024)[0].decode("utf-8"))# ACK
    #print("wyslano wiadomosc")

#=========================================================
# Wysłanie sekwencji CONNECT>REQUEST>""
print("Zadanie polaczenia z serwerem")
numer_sekwencyjny = 2
client.sendto(protocol.encode_messsage_Operacja(time.ctime(time.time()), "CONNECT", numer_sekwencyjny, client_ID).encode('utf-8'), dstHost)
numer_sekwencyjny -=1
client.sendto(protocol.encode_messsage_Status(time.ctime(time.time()), "REQUEST", numer_sekwencyjny, client_ID).encode(('utf-8')),dstHost)

received_message = protocol.decode_message(client.recvfrom(1024)[0].decode("utf-8")) # Odebranie ACK po inicjacji

received_message1 = protocol.decode_message(client.recvfrom(1024)[0].decode("utf-8"))
received_message2 = protocol.decode_message(client.recvfrom(1024)[0].decode("utf-8"))
received_message3 = protocol.decode_message(client.recvfrom(1024)[0].decode("utf-8"))
client_ID = received_message3["id"]
numer_sekwencyjny = 1
client.sendto(protocol.encode_messsage_Operacja(time.ctime(time.time()), "ACK", numer_sekwencyjny, client_ID).encode("utf-8"),dstHost)

print("Poprawnie polaczono z serwerem")
print("Otrzymane id:{}".format(client_ID))
print("Oczekiwanie na drugiego klienta")
def send_ack(sock, raw_data, adr_klienta):
    ack_data = protocol.encode_messsage_Operacja(time.ctime(time.time()),"ACK", numer_sekwencyjny, tablica_klientow[adr_klienta].id).encode("utf-8")
    sent = sock.sendto(ack_data, tablica_klientow[adr_klienta].adres_surowy)
    return sent
def client_connect():
    global nsesji
    global numer_sekwencyjny
    global addr
    adres_nadawcy =""
    adres_odbiorcy=""

    client_data, client_address = sock.recvfrom(1024)  # Odebranie komunikatu
    adr_klienta = adr_to_klucz(client_address[0], client_address[1])  # Klucz klienta ("IPv4:Port")
    adres_nadawcy = adr_klienta

    pakiet1 = protocol.decode_message(client_data.decode("utf-8"))  # Odkodowanie komunikatu
    

    if pakiet1["operacja"] == "CONNECT": # Jezeli operacja = CONNECT
        
        client_data, client_address = sock.recvfrom(1024) # Oczekiwanie na status REQUEST
        pakiet2 = protocol.decode_message(client_data.decode("utf-8")) # Odkodowanie pakietu

        if pakiet2["status"] == "REQUEST": # Jezeli status == REQUEST
            dodaj_klienta(adr_klienta, client_address) # Dodanie klienta do tablica_klientow
            numer_sekwencyjny = 1
            pakiet_ack = protocol.encode_messsage_Operacja(time.ctime(time.time()), "ACK", numer_sekwencyjny, pakiet2["id"]).encode("utf-8")
            sock.sendto(pakiet_ack, tablica_klientow[adr_klienta].adres_surowy)

            numer_sekwencyjny = 3
            sock.sendto(protocol.encode_messsage_Operacja(time.ctime(time.time()), "CONNECT", numer_sekwencyjny, tablica_klientow[adr_klienta].id).encode("utf-8"),tablica_klientow[adr_klienta].adres_surowy)
           
            numer_sekwencyjny -= 1
            sock.sendto(protocol.encode_messsage_Status(time.ctime(time.time()), "CONNECTED", numer_sekwencyjny, tablica_klientow[adr_klienta].id).encode("utf-8"), tablica_klientow[adr_klienta].adres_surowy)
            
            numer_sekwencyjny -= 1
            sock.sendto(protocol.encode_messsage_Dane(time.ctime(time.time()),numer_sekwencyjny,tablica_klientow[adr_klienta].id,"").encode("utf-8"),tablica_klientow[adr_klienta].adres_surowy)
            
            client_data, client_address = sock.recvfrom(1024)
            pakiet5 = protocol.decode_message(client_data.decode("utf-8"))
            addr.append(adr_klienta)
            print("Nowy klient!")

     # Obsługa DISCONNECT
    elif pakiet1["operacja"] == "DISCONNECT": 
        print("[SERWER] Otrzymano DISCONNECT")
        client_data, client_address = sock.recvfrom(1024) # Oczekiwanie na status
        pakiet2 = protocol.decode_message(client_data.decode("utf-8")) # Odkodowanie pakietu

        if pakiet2["status"] == "REQUEST":
            pakiet_ack = protocol.encode_messsage_Operacja(time.ctime(time.time()), "ACK", numer_sekwencyjny, pakiet1["id"]).encode("utf-8")# ACK dla DISCONNECT
            sock.sendto(pakiet_ack, tablica_klientow[adr_klienta].adres_surowy) # Wyslanie ACK

            # Koniec obslugi klienta ktory wywolal CLOSE
            print("[SERWER] Koniec obslugi klienta ktory wywolal CLOSE")

            #Przeslanie info o rozlaczeniu do drugiego klienta
            for adres in addr:
                if adres != adr_to_klucz(client_address[0],client_address[1]):
                        adres_odbiorcy = tablica_klientow[adres].adres_surowy

            numer_sekwencyjny = 2
            pakiet3 = protocol.encode_messsage_Operacja(time.ctime(time.time()), "DISCONNECT", numer_sekwencyjny, pakiet1["id"]).encode("utf-8")
            sock.sendto(pakiet3,adres_odbiorcy)# Wyslanie info o rozlaczeniu
            numer_sekwencyjny -= 1
            pakiet4 = protocol.encode_messsage_Status(time.ctime(time.time()), "TERMINATE", numer_sekwencyjny, pakiet1["id"]).encode("utf-8")
            sock.sendto(pakiet4,adres_odbiorcy)# Wyslanie info o rozlaczeniu

            pakiet5 = protocol.decode_message(client_data.decode("utf-8"))# Otrzymanie ACK
            print("[SERWER] Koniec obslugi drugiego klienta")
            # Koniec obslugi drugiego klienta
            reset_sesji()

    # Obsługa INVITE>REQUEST
    elif pakiet1["operacja"] == "INVITE":
        print("[SERWER] Otrzymano INVITE")

        client_data, client_address = sock.recvfrom(1024) # Oczekiwanie na status
        pakiet2 = protocol.decode_message(client_data.decode("utf-8")) # Odkodowanie pakietu
        #print(pakiet2)
        
        # Poszukiwanie adresu rozmowcy
        for adres in tablica_klientow:
            if adres != adres_nadawcy:
                adres_odbiorcy = tablica_klientow[adres_nadawcy].adres_surowy

        if pakiet2["status"] == "REQUEST":
            print("[SERWER] Otrzymano request")
            numer_sekwencyjny = 1
            pakiet_ack = protocol.encode_messsage_Operacja(time.ctime(time.time()), "ACK", numer_sekwencyjny, pakiet2["id"]).encode("utf-8")
            sock.sendto(pakiet_ack, client_address) # ACK SEND
            
            for adres in addr:
                if adres != adr_to_klucz(client_address[0],client_address[1]):
                    adres_odbiorcy = tablica_klientow[adres].adres_surowy

            print(adr_to_klucz(client_address[0],client_address[1]))
            print(adres_odbiorcy)

            print("[SERWER] Odebrano serie invite/request")


            # Wysłanie serii komunikatow zapraszajacych do rozmowy
            numer_sekwencyjny = 2
            sock.sendto(protocol.encode_messsage_Operacja(time.ctime(time.time()), "INVITE", numer_sekwencyjny, tablica_klientow[adr_klienta].id).encode("utf-8"),adres_odbiorcy)
            
            sock.sendto(protocol.encode_messsage_Status(time.ctime(time.time()), "REQUEST", numer_sekwencyjny, tablica_klientow[adr_klienta].id).encode("utf-8"), adres_odbiorcy)
           
            client_data, client_address = sock.recvfrom(1024)# ACK RECV
            print("Wyslano invite/request")
            # Koniec serii

        elif pakiet2["status"] == "ACCEPT":
            print("[SERWER] Odebrano INVITE/ ACCEPT")
            numer_sekwencyjny = 1
            pakiet_ack = protocol.encode_messsage_Operacja(time.ctime(time.time()), "ACK", numer_sekwencyjny, pakiet2["id"]).encode("utf-8")
            sock.sendto(pakiet_ack, tablica_klientow[adr_klienta].adres_surowy)# ACK SEND
            

            for adres in addr:
                if adres != adr_to_klucz(client_address[0],client_address[1]):
                    adres_odbiorcy = tablica_klientow[adres].adres_surowy

            send_invite_accept(adres_odbiorcy)# wyslanie potwierdzenia zaproszenia

            for adres in tablica_klientow:
                if tablica_klientow[adres].adres_surowy == adres_odbiorcy:
                    tablica_klientow[adres].nr_sesji=nsesji
                elif tablica_klientow[adres].adres_surowy == client_address:
                    tablica_klientow[adres].nr_sesji=nsesji
            nsesji+=1

        elif pakiet2["status"] == "DENY":
            print("[SERWER] Odebrano INVITE/ DENY")
            numer_sekwencyjny = 1
            pakiet_ack = protocol.encode_messsage_Operacja(time.ctime(time.time()), "ACK", numer_sekwencyjny, pakiet2["id"]).encode("utf-8")
            sock.sendto(pakiet_ack, tablica_klientow[adr_klienta].adres_surowy)# ACK SEND
            

            for adres in addr:
                if adres != adr_to_klucz(client_address[0],client_address[1]):
                    adres_odbiorcy = tablica_klientow[adres].adres_surowy
            send_invite_denied(adres_odbiorcy)

            sock.sendto(protocol.encode_messsage_Dane(time.ctime(time.time()),numer_sekwencyjny,tablica_klientow[adr_klienta].id,"DENY").encode("utf-8"),tablica_klientow[adr_klienta].adres_surowy)
            client_data, client_address = sock.recvfrom(1024)
            reset_sesji()


    elif pakiet1["operacja"]=="COMMUNICATE":
        #wyslij_do_sesji(sock, adr_klienta, client_data)
        #print("Otrzymano COMMUNICATE")
        client_data, client_address = sock.recvfrom(1024) # Oczekiwanie na status REQUEST
        pakiet2 = protocol.decode_message(client_data.decode("utf-8")) # Odkodowanie pakietu

        if pakiet2["status"]=="SENT":
            #print("Otrzymano SENT")
            client_data, client_address = sock.recvfrom(1024) # Oczekiwanie na status REQUEST
            pakiet3 = protocol.decode_message(client_data.decode("utf-8")) # Odkodowanie pakietu
           
            print("[  " + pakiet3["id"] + "  ] " + pakiet3["data"])
            for adres in tablica_klientow:
                if adres == adres_nadawcy:
                    adres_odbiorcy = tablica_klientow[adres_nadawcy].adres_surowy

            numer_sekwencyjny = 1
            pakiet_ack = protocol.encode_messsage_Operacja(time.ctime(time.time()), "ACK", numer_sekwencyjny, pakiet1["id"]).encode("utf-8")
            sock.sendto(pakiet_ack, adres_odbiorcy)

            wyslij_do_sesji(sock, adr_klienta, client_data)# Przesłanie komunikatu do docelowego uczestnika sesji