es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cliente de prueba de TCP devolviendo una tupla inesperada.

import socket

def cliente():
ip = input(‘escribe y envía la dirección IP a la que deseas conectarte: ‘)
host = socket.gethostbyaddr(ip)
port = 8080

s = socket.socket()
s.connect((host, port))

username = input(‘escribe y envía tu nombre de usuario: ‘)
while True:
message = input()
if message == ‘q’:
break
message = username + ‘> ‘ + message
s.send(message.encode(‘utf-8’))
data = s.recv(1024).decode(‘utf-8’)
print(data)
s.close()

if name == ‘main‘:
cliente()

Estoy creando un cliente de mensajería y estoy desarrollando la parte del cliente, desafortunadamente me he encontrado con un problema, cuando hago socket.gethostbyaddr(ip) cree que la variable ip es una tupla, y ni siquiera estoy seguro de qué es eso, no he encontrado a nadie con el mismo problema que yo.

Error al escribir y enviar la dirección IP:

Traceback (most recent call last):
File “C:\Users\Checken\Desktop\messaging client test\client.py”, line 23, in
cliente()
File “C:\Users\Checken\Desktop\messaging client test\client.py”, line 9, in cliente
s.connect((host, port))
TypeError: se esperaba str, bytes o bytearray, no tupla

Tags:  ,

Answer

  1. Avatar for davy.ai

    Explicación del problema en el código del cliente de mensajes

    El código anterior es un script de Python que crea un cliente de mensajes utilizando el módulo socket. La función client() solicita al usuario ingresar una dirección IP a la que conectarse, luego intenta obtener el nombre de host asociado con esa IP utilizando el método gethostbyaddr() del módulo socket.

    Sin embargo, el script falla con un TypeError al intentar conectarse en esta línea:

    s.connect((host, port))
    

    La razón del error es que host se ha asignado al resultado de gethostbyaddr(), que devuelve una tupla que contiene tres elementos: el nombre de host canónico, la lista de alias y la dirección IP. Por lo tanto, al intentar usar host como argumento de s.connect(), el código está pasando una tupla en lugar de una cadena.

    Solución

    Para solucionar este error, necesitamos extraer el nombre de host de la tupla devuelta y pasarlo como una cadena a s.connect().

    Aquí está el código corregido:

    import socket
    
    def client():
        ip = input('escriba y envíe la dirección IP a la que desea conectarse: ')
        host = socket.gethostbyaddr(ip)[0]  # Extraer el nombre de host de la tupla
        port = 8080
    
        s = socket.socket()
        s.connect((host, port))
    
        username = input('escriba y envíe su nombre de usuario: ')
        while True:
            message = input()
            if message == 'q':
                break
            message = username + '> ' + message
            s.send(message.encode('utf-8'))
            data = s.recv(1024).decode('utf-8')
            print(data)
        s.close()
    
    if __name__ == '__main__':
        client()
    

    Ahora, llamamos a [0] en el resultado de gethostbyaddr() para extraer el nombre de host como una cadena. Esto debería permitir que el código se ejecute correctamente y se conecte a la dirección IP deseada.

Comments are closed.