¿Cómo pedir entrada en una toma TCP en Python?

Estoy tratando de traducir una toma UDP funcional que tengo a TCP, pero estoy teniendo un momento difícil porque no puedo encontrar la explicación por qué no puedo conseguir entradas para trabajar en el TCP. El mismo código, en UDP, funcionaría. En TCP simplemente obtengo una entrada "blank".

lado del cliente

    elif cmd[0] == 'INSERT':
        name = input("\nNAME: ")
        artist = input("ARTIST: ")
        album = input("ALBUM NAME: ")
        year = input("YEAR: ")
        newsong = name + ";" + artist + ";" + album + ";" + year + "\n"
        sock.sendto(bytes(newsong, "UTF-8"), serv)

Servidor

        elif cmd[0].upper() == 'INSERT':
            with open("songs.txt", "a", encoding='UTF-8') as fd:
                receive_message = con.recvfrom(TAM_MSG)
                msg = receive_message[0]
                fd.write(str(msg, "UTF-8"))
                fd.close()

Eso funciona totalmente en UDP, pero no en TCP. ¿Hay alguna manera de que pueda entrar en el servidor TCP? ¿Cómo? Gracias.

Pregunta hecha hace 3 años, 5 meses, 0 días - Por algorithmarchitect


3 Respuestas:

  • Bueno, leí sobre TCP y tiene que tener un flujo de dos vías, como lo señalaron los chicos en los comentarios.

    Añadiendo sólo una línea al comienzo de la server.py hizo el truco.

    con.send(str.encode(f"Inserting a new song: "))
    

    ¡Gracias a todos!

    P.S: Esta no es la mejor respuesta, ya que soy un novato. Tuve suerte, supongo, así que funcionó. para mí.

    Respondida el Dec 17, 2020 a las 17:53 - por markupmaestro

    Votos positivos: 0 | Votos negativos: 0

  • El problema que estás experimentando con la entrada en tu servidor TCP se debe a que estás usando recvfrom() en lugar de recv(). La función recvfrom() se utiliza comúnmente con sockets UDP, ya que además de recibir datos, también devuelve la dirección del remitente, lo cual no es necesario en un socket TCP.

    En su lugar, deberías usar la función recv() para recibir los datos en un socket TCP. Aquí te dejo una versión corregida de tu código del servidor:

    python
    elif cmd[0].upper() == 'INSERT':
        with open("songs.txt", "a", encoding='UTF-8') as fd:
            msg = con.recv(TAM_MSG)
            fd.write(str(msg, "UTF-8"))
            fd.close()
    

    Al hacer este cambio, ahora deberías poder recibir correctamente la entrada del cliente en tu servidor TCP. Recuerda adaptar también tu código del lado cliente para enviar los datos en un formato adecuado para ser recibidos por la función recv() en el servidor.

    Espero que esto resuelva tu problema. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 18, 2020 a las 17:49 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • El código del servidor proporcionado no está escuchando correctamente los datos TCP. En TCP, los datos se envían como un flujo continuo, a diferencia de UDP, donde los datos se envían en paquetes discretos. Por lo tanto, debes utilizar recv() en lugar de recvfrom() para recibir datos TCP.

    Aquí tienes el código del servidor corregido:

    python
            elif cmd[0].upper() == 'INSERT':
                with open("songs.txt", "a", encoding='UTF-8') as fd:
                    receive_message = con.recv(TAM_MSG)
                    msg = receive_message.decode("UTF-8")
                    fd.write(msg)
                    fd.close()
    

    Además, debes asegurarte de que el lado del cliente está enviando los datos correctamente. En TCP, debes enviar los datos como un flujo continuo, no como paquetes discretos. Puedes utilizar sendall() en lugar de sendto() para enviar datos TCP.

    Aquí tienes el código del cliente corregido:

    python
        elif cmd[0] == 'INSERT':
            name = input("\nNAME: ")
            artist = input("ARTIST: ")
            album = input("ALBUM NAME: ")
            year = input("YEAR: ")
            newsong = name + ";" + artist + ";" + album + ";" + year + "\n"
            sock.sendall(bytes(newsong, "UTF-8"))
    

    Con estos cambios, el servidor TCP debería poder recibir los datos de entrada del cliente.

    Respondida el Dec 18, 2020 a las 17:55 - por Gemini

    Votos positivos: 0 | Votos negativos: 0