예제 #1
0
    def testSenderClose(self, mock_pika):
        s = Sender()
        s.close()

        mock_pika.BlockingConnection.return_value.close.assert_called_with()
예제 #2
0
class ClientApp(tk.Tk):
    def __init__(self, download_dir, source_dir):
        self.download_dir = download_dir
        tk.Tk.__init__(self)
        self.title("Torrent Sucks")
        self.geometry("500x500+300+100")
        self.resizable(False, True)
        self.config(bg="#474040")

        self.frame = tk.Frame(self, bg='#474040')
        self.frame.pack(side=tk.TOP, fill=tk.BOTH)

        self.search_bar = PlaceholderEntry(self.frame,
                                           "Please Enter the Filename",
                                           width=50)
        self.search_bar.pack(side=tk.LEFT, pady=20, padx=20)

        self.search_button = FocusButton(self.frame,
                                         text="Search",
                                         in_color="gray",
                                         out_color="black",
                                         fg="white",
                                         command=self.search)
        self.search_button.pack(side=tk.RIGHT, padx=20, pady=20)

        self.listbox_frame = tk.Frame(self, bg="#474040")
        self.listbox_frame.pack(side=tk.TOP, fill=tk.BOTH)

        self.listbox = tk.Listbox(self.listbox_frame, width=70, height=20)
        self.listbox.pack(side=tk.TOP, pady=20, padx=20)

        self.download_button = FocusButton(self.listbox_frame,
                                           text="Download",
                                           in_color="#52bf9c",
                                           out_color="#6ed1ff",
                                           fg="black",
                                           command=self.download)
        self.download_button.pack(side=tk.RIGHT, pady=20, padx=20)

        self.status_text = tk.Label(self.listbox_frame,
                                    text="",
                                    bg="#474040",
                                    font='Helvetica 10 bold')
        self.status_text.pack(side=tk.LEFT, pady=20, padx=20)

        #Start listener
        global host
        self.listener = Listener(host, source_dir)
        self.host, self.port = self.listener.get_self()

        print("Running On: {}:{}".format(self.host, self.port))

        self.listen_thread = multiprocessing.Process(
            target=self.listener.listen)
        self.listen_thread.start()

        self.protocol("WM_DELETE_WINDOW", self.on_closing)
        self.search_file = ""

        #Start Sender

        self.sender = Sender(source_dir, self.host, self.port)

        global ft_server
        #Uncomment this if server is on
        print("Connecting to Server...")
        # print(ft_server[0])
        # print(ft_server[1])
        status = self.sender.start_conn(ft_server[0], ft_server[1])
        if (status == 0):
            tkinter.messagebox.showerror(
                title="Error",
                message=
                "Couldn't correctly connect to FT server!\nCheck the ip configuration in Client.py, and restart the app!"
            )


# If server is not ready this will say "Could not connect to server"

    def search(self):
        filename = self.search_bar.get().strip()
        self.search_file = filename
        self.listbox.delete(0, tk.END)
        succ, status_message = self.sender.search(filename)

        if not succ:
            self.status_text.configure(text=status_message, fg="red")

        else:
            self.status_text.configure(text="")
            for result in self.sender.get_results():
                self.listbox.insert(tk.END, result.strip())

    def download(self):
        #<jpg, 54280, 07/30/2018, 127.0.0.1, 55682>
        data = self.listbox.get(tk.ACTIVE).strip()[1:-1].split(',')
        data = list(map(lambda str: str.strip(), data))
        status_message = "Nothing happened"
        status_color = "gray"

        if (len(data) != 5):
            status_message = "Failed to download data format is not correct!"
            status_color = "red"
        else:
            req_file = {
                "name": self.search_file,  #self.search_bar.get().strip()
                "type": data[0],
                "size": int(data[1]),
                "date": data[2],
                "ip": data[3],
                "port": int(data[4]),
                "dir": self.download_dir
            }
            succ, status_message = download_handler(req_file)
            if (succ):
                status_color = "green"
            else:
                status_color = "red"

        self.status_text.configure(text=status_message, fg=status_color)

    def on_closing(self):
        print("Closing!")
        self.sender.close()

        self.listen_thread.terminate()
        sys.exit()
예제 #3
0
class Manager:
    #método construtor
    def __init__(self):
        #lista de conectados
        self.connected = []

        #lista de nomes conectados
        self.names_connected = []

        #instancia um cliente
        self.client = Client()

        #threads
        #envio
        self.ts = None
        #recebimento multicast
        self.tr = None
        #recebimento privado
        self.trp = None
        #listener para entrada do teclado
        self.tl = None

        #flag de controle para que não seja enviado mais que uma mensagem (type 3)
        self.is_first_message = True

    #função que inicializa a threads
    def set_threads(self, manager):
        self.ts = Sender(self.client.multicast_addr, self.client.port,
                         self.client.pvt_port)
        self.ts.start()
        self.tr = Receiver(self.client.multicast_addr, self.client.port,
                           manager)
        self.tr.start()
        self.trp = Receiver_pvt(manager)
        self.trp.start()
        self.tl = Listener(manager)
        self.tl.start()

    #fecha a conexão com os sockets
    def stop_threads(self):
        self.ts.close()
        self.tr.close()
        self.trp.close()

    #adiciona um usuário na lista de conectados
    def add_user(self, client):
        self.connected.append(client)
        self.names_connected.append(client.nick)

    #remove um usuário da lista de conectados
    def pop_user(self, client):
        if (client in self.connected):
            self.connected.remove(client)
        self.names_connected.remove(client.nick)
        print("------------------------------")
        print(client.nick, "saiu do chat")
        print("------------------------------")

    #imprime a lista de conectados
    def show_connected(self):
        print("------------------------------")
        print("Lista de Conectados:")
        for person in self.connected:
            print(person.nick)
        print("------------------------------")

    #Filtra a mensagem de entrada em usuário e mensagem a ser enviada
    def filter_msg(self, data, ch=" "):
        cli = None
        index = [i for i, ltr in enumerate(data) if ltr == ch]
        name = data[index[0] + 1:index[1]]
        for person in self.connected:
            if person.nick == name:
                cli = person
        msg = data[index[1] + 1:]
        return cli, msg

    #define um objeto de mensagem para fazer o envio
    def set_msg(self, data):
        msg = None
        if (len(data) == 1):
            if "TO" in data[0]:
                dst_cli, text = self.filter_msg(data[0])
                msg = Message(4, self.client, len(text), text,
                              dst_cli.pvt_addr)
                if (dst_cli == self.client):
                    print(msg.message)
            elif "COMMANDS" in data[0]:
                self.show_commands()
            elif "SHOW_ALL" in data[0]:
                self.show_connected()
            elif "LEAVE" in data[0]:
                msg = Message(5, self.client, len(""), "")
            else:
                text = data[0]
                msg = Message(3, self.client, len(text), text)
        else:
            msg = Message(data[0], data[1], data[2], data[3])
        return msg

    #imprime mensagem privada
    def print_pvt(self, msg):
        print("------------------------------")
        print("Mensagem privada de " + msg.source.nick + ": " + msg.message)
        print("------------------------------")

    #gerencia a mensagem
    def manage_msg(self, msg):

        #verifica se a mensagem é do tipo join
        if (msg.type == 1):

            #caso o join recebido seja do cliente
            if (msg.source.nick == self.client.nick):

                #se o cliente não está na lista de conectados
                if (self.client.nick not in self.names_connected):
                    #cria o pacote a partir da mensagem
                    pckg = msg.get_package()

                    #dá o join no cliente
                    self.join(pckg)

            #caso o join recebido não seja do cliente
            else:
                #adiciona a fonte da mensagem na lista de conectados
                self.add_user(msg.source)
                print("------------------------------")
                print(msg.source.nick, "entrou no chat.")
                print("------------------------------")
                #envia um join_ack
                self.join_ack()

        #se o join_ack não for do cliente
        elif (msg.type == 2 and msg.source.nick != self.client.nick):

            #se a fonte do join_ack não está na lista de conectados
            if (msg.source.nick not in self.names_connected):
                self.add_user(msg.source)

        #se a mensagem nao foi enviada por esse cliente
        elif (msg.type == 3 and msg.source.nick != self.client.nick):
            self.receive_message(msg)

        #se a mensagem foi enviada por esse cliente
        elif (msg.type == 3 and msg.source.nick == self.client.nick):
            if (self.is_first_message):
                self.is_first_message = False
                pckg = msg.get_package()
                self.ts.send(pckg)
            else:
                self.is_first_message = True

        #caso a mensagem for privada mas é de outra fonte
        elif (msg.type == 4 and msg.source.nick != self.client.nick):
            self.print_pvt(msg)

        #caso a mensagem seja privada e seja do mesmo cliente
        elif (msg.type == 4 and msg.source.nick == self.client.nick):
            pckg = msg.get_package()
            self.ts.send_pvt(pckg, msg.dest)

        #remove o cliente que saiu da lista
        elif (msg.type == 5 and msg.source.nick != self.client.nick):
            self.pop_user(msg.source)

        #finaliza a conexão do cliente
        elif (msg.type == 5 and msg.source.nick == self.client.nick):
            pckg = msg.get_package()
            self.ts.send(pckg)
            self.ts.stop = True
            print("------------------------------")
            print("Conexão encerrada.")
            print("------------------------------")
            self.stop_threads()
            os._exit(0)

    #imprime os comandos do chat na tela
    def show_commands(self):
        print("------------------------------")
        print("Lista de comandos:")
        print(
            "TO nomedousuario mensagem : Comando para enviar mensagens privadas."
        )
        print("SHOW_ALL : Mostra o nome de todos usuários conectados.")
        print("LEAVE : Sai do chat")
        print("------------------------------")

    #realiza o join
    def join(self, pckg):
        #envia o pacote para todos os clientes
        self.ts.send(pckg)
        #adiciona o cliente na lista de conectados
        self.add_user(self.client)
        print("Olá " + self.client.nick + " você foi conectado")
        print("Digite COMMANDS para ver os comandos")
        print("------------------------------")

    #realiza o join_ack
    def join_ack(self):
        #cria a mensagem a partir de uma lista
        msg = self.set_msg([2, self.client, 0, ""])

        #recebe o valor da mensagem em um pacote de bytes
        pckg = msg.get_package()

        #envia o pacote
        self.ts.send(pckg)

    def receive_message(self, msg):
        print(msg.source.nick + " disse a todos: " + msg.message)

    #conecta o cliente
    def connect(self):
        #cria a mensagem a partir de uma lista
        msg = self.set_msg([1, self.client, 0, ""])

        #define o que fazer com a mensagem
        self.manage_msg(msg)