Esempio n. 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
Esempio n. 2
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")
Esempio n. 4
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
Esempio n. 6
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
Esempio n. 7
0
def run(tcp_ip, tcp_port, gui, ai=None):
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    print("connecting to", tcp_ip)
    sock.connect((tcp_ip, tcp_port))

    running = True
    inputs = [
        sock,
    ]

    # If no AI, this thread will manage keyboard inputs
    # TODO : remove for a more advanced GUI
    if ai is None:
        inputs.append(sys.stdin)

    data = b''
    while running:
        rds, wts, ers = select.select(inputs, [], [], 0)
        for s in rds:
            if s is sys.stdin:
                # Managing keyboard input
                cmd = s.readline()
                send(sock, 'play', cmd.strip())
            if s is sock:
                d = s.recv(2048)
                if d:
                    data += d
                else:
                    print("lost connection")
                    running = False

        # manage data
        msg, remain = extract_msg(data)
        if msg:
            mtype, mval = decode_message(msg)
            gui.process_message(mtype, mval)

            # if an AI is attached, ask for a play
            if ai is not None:
                play = ai.process_message(mtype, mval)
                if play is not None:
                    send(sock, 'play', play)
        data = remain
    sock.close()
Esempio n. 8
0
    def process_msg(self, client, msg):
        if len(self.players) != 2:
            send(client, 'info', "Waiting for opponent")
            return
        msg_type, msg = decode_message(msg)

        if msg_type == 'play':
            try:
                self.game.play(self.players[client], msg)
                p = player_name(self.players[client])
                self.broadcast('info', "%s played %s" % (p, msg))
                self.send_game()
            except AwaleException as e:
                send(client, 'error', str(e))
            if self.game.over():
                win_player = winner(self.game.game, self.game.scores)
                if win_player is not None:
                    self.broadcast('info',
                                   "%s wins !" % player_name(win_player))
                else:
                    self.broadcast('info', "Draw !")
                self.running = False
Esempio n. 9
0
    #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")

#========================================================================
while True:
    received_message = protocol.decode_message(client.recvfrom(1024)[0].decode("utf-8"))
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