def handle(self):
        # Escribe dirección y puerto del cliente (de tupla client_address)
        IP_CLIENT = str(self.client_address[0])
        PUERTO_CLIENT = self.client_address[1]
        nonce = 898989898798989898989
        while 1:
            # Leyendo línea a línea lo que nos envía el cliente
            line = self.rfile.read()
            method_client = line.decode('utf-8').split(' ')[0]
            # Si no hay más líneas salimos del bucle infinito
            if not line:
                break

            print("El cliente nos manda: \r\n" + line.decode('utf-8'))
            data = line.decode('utf-8').split("\r\n")

            if not method_client in methods:
                answer = ("SIP/2.0 405 Method Not Allowed" + '\r\n\r\n')
                self.wfile.write(bytes(answer, 'utf-8'))
                print("Enviando: \r\n" + answer)

            elif method_client == "REGISTER":
                linea_troceada = line.decode('utf-8').split(" ")

                if len(linea_troceada) == 4:
                    # Enviamos: SIP/2.0 401 Unauthorized
                    direccionsip_usuario = linea_troceada[1].split(':')[1]
                    expires = int(linea_troceada[-1])
                    puerto_cliente = (linea_troceada[1].split(':')[-1])
                    data = line.decode('utf-8').split("\r\n")
                    texto = " ".join(data)
                    fich_log(PATH_LOGSERVER, "received",
                             IP_CLIENT, puerto_cliente, texto)

                    if expires > 0:
                        answer = ("SIP/2.0 401 Unauthorized" + "\r\n")
                        answer += "WWW Authenticate: nonce="
                        answer += str(nonce) + "\r\n\r\n"
                        self.wfile.write(bytes(answer, 'utf-8') + b'\r\n')
                        print("Enviando: \r\n" + answer)
                        lista = answer.split('\r\n')
                        texto = " ".join(lista)
                        fich_log(PATH_LOGSERVER, "sent_to",
                                 IP_CLIENT, puerto_cliente, texto)

                    elif expires == 0:
                        # Borramos a usuario expirado
                        del self.usuarios_registrados[direccionsip_usuario]
                        print("Borramos: ", direccionsip_usuario)
                        answer = "SIP/2.0 200 OK\r\n "
                        self.wfile.write((bytes(answer, 'utf-8')) + b'\r\n')
                        lista = answer.split('\r\n')
                        texto = " ".join(lista)
                        fich_log(PATH_LOGSERVER, "sent_to",
                                 IP_CLIENT, puerto_cliente, texto)

                else:
                    # Comprobamos el response
                    direccionsip_client2 = linea_troceada[1].split(':')[1]
                    puerto_client2 = int(linea_troceada[1].split(':')[-1])
                    expires = int(linea_troceada[3].split('\r\n')[0])
                    response = linea_troceada[-1].split('=')[-1]
                    response = response.split('\r')[0]
                    lista = line.decode('utf-8').split("\r\n")
                    texto = " ".join(lista)
                    fich_log(PATH_LOGSERVER, "received",
                             IP_CLIENT, puerto_client2, texto)
                    m = hashlib.md5()
                    for usuario in passwords_usuarios.keys():
                        if usuario == direccionsip_client2:
                            password = passwords_usuarios[usuario]
                    m.update(bytes(password, 'utf-8'))
                    m.update(bytes(str(nonce), 'utf-8'))
                    if m.hexdigest() == response:
                        answer = "SIP/2.0 200 OK\r\n\r\n"
                        print("Enviamos :\r\n", answer)
                        self.wfile.write(bytes(answer, 'utf-8') + b'\r\n')
                        lista = answer.split('\r\n')
                        texto = " ".join(lista)
                        fich_log(PATH_LOGSERVER, "sent_to",
                                 IP_CLIENT, puerto_client2, texto)
                        hora_actual = time.time()
                        hora_exp = hora_actual + expires
                        info = [IP_CLIENT, puerto_client2,
                                hora_actual, hora_exp]
                        self.usuarios_registrados[direccionsip_client2] = info
                        #self.register2file()
                    else:
                        answer = "SIP/2.0 401 Unauthorized\r\n"
                        answer += "WWW Authenticate: nonce="
                        answer += str(nonce) + "\r\n\r\n"
                        self.wfile.write(bytes(answer, 'utf-8') + b'\r\n')
                        print("Enviando: \r\n" + answer)
                        lista = answer.split('\r\n')
                        texto = " ".join(lista)
                        fich_log(PATH_LOGSERVER, "sent_to",
                                 IP_CLIENT, PUERTO_CLIENT, texto)

                self.register2file()

            elif method_client == "INVITE":
                data = line.decode('utf-8').split("\r\n")
                texto = " ".join(data)
                fich_log(PATH_LOGSERVER, "received",
                         IP_CLIENT, PUERTO_CLIENT, texto)
                # Enviamos INVITE a destinatorio correspondiente
                linea_troceada = line.decode('utf-8').split(" ")
                destino_invite = linea_troceada[1].split(':')[1]
                print("Se lo enviamos a: ", destino_invite)
                if destino_invite in self.usuarios_registrados:
                    IP_DESTINO = self.usuarios_registrados[destino_invite][0]
                    PUERTO_DEST = self.usuarios_registrados[destino_invite][1]
                    lista = line.decode("utf-8").split('\r\n')
                    texto = " ".join(lista)
                    fich_log(PATH_LOGSERVER, "sent_to",
                             IP_DESTINO, PUERTO_DEST, texto)
                    # Creamos socket
                    my_socket = socket.socket(socket.AF_INET,
                                              socket.SOCK_DGRAM)
                    my_socket.setsockopt(socket.SOL_SOCKET,
                                         socket.SO_REUSEADDR, 1)
                    my_socket.connect((IP_DESTINO, int(PUERTO_DEST)))
                    my_socket.send(line)
                    data = my_socket.recv(1024)
                    print("Recibido: \r\n", data.decode('utf-8'))
                    lista = data.decode('utf-8').split("\r\n")
                    texto = " ".join(lista)
                    fich_log(PATH_LOGSERVER, "received",
                             IP_DESTINO, PUERTO_DEST, texto)
                    # Reenviamos al cliente
                    self.wfile.write(data)
                    print("Enviando: \r\n" + data.decode("utf-8"))
                    data = data.decode('utf-8').split("\r\n")
                    texto = " ".join(data)
                    fich_log(PATH_LOGSERVER, "sent_to",
                             IP_CLIENT, PUERTO_CLIENT, texto)

                else:
                    # Usuario no registrado
                    answer = "SIP/2.0 404 User Not Found\r\n"
                    self.wfile.write(bytes(answer, 'utf-8') + b'\r\n')
                    print("Enviando: \r\n" + answer)
                    lista = answer.split('\r\n')
                    texto = " ".join(lista)
                    fich_log(PATH_LOGSERVER, "sent_to",
                             IP_CLIENT, PUERTO_CLIENT, texto)

            elif method_client == "ACK":
                data = line.decode('utf-8').split("\r\n")
                texto = " ".join(data)
                fich_log(PATH_LOGSERVER, "received",
                         IP_CLIENT, PUERTO_CLIENT, texto)
                linea_troceada = line.decode('utf-8').split(" ")
                destino_invite = linea_troceada[1].split(':')[1]
                IP_DESTINO = self.usuarios_registrados[destino_invite][0]
                PUERTO_DEST = self.usuarios_registrados[destino_invite][1]
                print("Se lo enviamos a: ", destino_invite)
                print("con IP: ", IP_DESTINO, " y PUERTO: ", PUERTO_DEST)
                # Creamos socket
                my_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
                my_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
                my_socket.connect((IP_DESTINO, int(PUERTO_DEST)))
                my_socket.send(line)
                lista = line.decode("utf-8").split('\r\n')
                texto = " ".join(lista)
                fich_log(PATH_LOGSERVER, "sent_to",
                         IP_DESTINO, PUERTO_DEST, texto)

            elif method_client == "BYE":
                data = line.decode('utf-8').split("\r\n")
                texto = " ".join(data)
                fich_log(PATH_LOGSERVER, "received",
                         IP_CLIENT, PUERTO_CLIENT, texto)
                linea_troceada = line.decode('utf-8').split(" ")
                destino_invite = linea_troceada[1].split(':')[1]
                print("Se lo enviamos a: ", destino_invite)
                if destino_invite in self.usuarios_registrados:
                    IP_DESTINO = self.usuarios_registrados[destino_invite][0]
                    PUERTO_DEST = self.usuarios_registrados[destino_invite][1]
                    lista = line.decode("utf-8").split('\r\n')
                    texto = " ".join(lista)
                    fich_log(PATH_LOGSERVER, "sent_to",
                             IP_DESTINO, PUERTO_DEST, texto)
                    # Creamos socket
                    my_socket = socket.socket(socket.AF_INET,
                                              socket.SOCK_DGRAM)
                    my_socket.setsockopt(socket.SOL_SOCKET,
                                         socket.SO_REUSEADDR, 1)
                    my_socket.connect((IP_DESTINO, int(PUERTO_DEST)))
                    my_socket.send(line)
                    data = my_socket.recv(1024)
                    print('Recibimos: \r\n', data.decode('utf-8'))
                    lista = data.decode('utf-8').split("\r\n")
                    texto = " ".join(lista)
                    fich_log(PATH_LOGSERVER, "received",
                             IP_DESTINO, PUERTO_DEST, texto)
                    # Reenviamos al cliente
                    self.wfile.write(data)
                    print("Enviando: \r\n" + data.decode("utf-8"))
                    data = data.decode('utf-8').split("\r\n")
                    texto = " ".join(data)
                    fich_log(PATH_LOGSERVER, "sent_to",
                             IP_CLIENT, PUERTO_CLIENT, texto)

                else:
                    # Usuario no registrado
                    answer = "SIP/2.0 404 User Not Found\r\n"
                    self.wfile.write(bytes(answer, 'utf-8') + b'\r\n')
                    print("Enviando: \r\n" + answer)
                    lista = answer.split('\r\n')
                    texto = " ".join(lista)
                    fich_log(PATH_LOGSERVER, "sent_to",
                             IP_CLIENT, PUERTO_CLIENT, texto)
            else:

                answer = ("SIP/2.0 400 Bad Request" + '\r\n\r\n')
                self.wfile.write(bytes(answer, 'utf-8'))
                print("Enviando: \r\n" + answer)
                lista = answer.split('\r\n')
                texto = " ".join(lista)
                fich_log(PATH_LOGSERVER, "sent_to",
                         IP_CLIENT, PUERTO_CLIENT, texto)
    def handle(self):
        # Escribe dirección y puerto del cliente (de tupla client_address)
        IP_CLIENT = str(self.client_address[0])
        PUERTO_CLIENT = int(self.client_address[1])
        while 1:
            # Leyendo línea a línea lo que nos envía el cliente
            line = self.rfile.read()
            method_client = line.decode('utf-8').split(' ')[0]
            linea_deco = line.decode('utf-8').split(' ')
            #Incluimos lo recibido en fichero log
            texto = " ".join(line.decode('utf-8').split("\r\n"))
            fich_log(PATH_LOG, "received", IP_CLIENT, PUERTO_CLIENT, texto)

            # Si no hay más líneas salimos del bucle infinito
            if not line:
                break

            print("El cliente nos manda: \r\n" + line.decode('utf-8'))
            if not method_client in methods:
                answer = ("SIP/2.0 405 Method Not Allowed" + '\r\n\r\n')
                self.wfile.write(bytes(answer, 'utf-8'))

            elif method_client == "INVITE":
                # Mandamos código respuesta
                IP_RTPDESTINO = linea_deco[4].split("\r\n")[0]
                PUERTO_RTPDESTINO = linea_deco[7].split(" ")[-1]

                self.RTP["ip"] = IP_RTPDESTINO
                self.RTP["puerto"] = PUERTO_RTPDESTINO
                answer = ("SIP/2.0 100 Trying" + '\r\n\r\n' +
                          "SIP/2.0 180 Ringing" + '\r\n\r\n' +
                          "SIP/2.0 200 OK" + '\r\n\r\n')
                answer += "Content-Type: application/sdp\r\n\r\n"
                answer += "v=0\r\n" + "o=" + USERNAME + " " + IP + " \r\n"
                answer += "s=SIP's PARTY" + "\r\n" + "t=0" + "\r\n"
                answer += "m=audio " + PUERTO_RTP + " RTP" + "\r\n"
                print(" Codigo respuesta a INVITE:  \r\n", answer)
                self.wfile.write(bytes(answer, 'utf-8'))
                lista = answer.split('\r\n')
                texto = " ".join(lista)
                fich_log(PATH_LOG, "sent_to", IP_CLIENT, PUERTO_CLIENT, texto)

            elif method_client == "BYE":
                answer = "SIP/2.0 200 OK\r\n"
                print(" Codigo respuesta a BYE:  \r\n", answer)
                self.wfile.write(bytes(answer, 'utf-8'))
                lista = answer.split('\r\n')
                texto = " ".join(lista)
                fich_log(PATH_LOG, "sent_to", IP_CLIENT, PUERTO_CLIENT, texto)

            elif method_client == "ACK":
                #Comenzamos envio RTP
                aEjecutar = "./mp32rtp -i " + self.RTP["ip"]
                aEjecutar += " -p " + self.RTP["puerto"]
                aEjecutar += " < " + PATH_AUDIO
                print("Vamos a ejecutar", aEjecutar)
                os.system(aEjecutar)

            else:
                answer = ("SIP/2.0 400 Bad Request" + '\r\n\r\n')
                self.wfile.write(bytes(answer, 'utf-8'))
                lista = answer.split('\r\n')
                texto = " ".join(lista)
                fich_log(PATH_LOG, "sent_to", IP_CLIENT, PUERTO_CLIENT, texto)