entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

-1voto

Error en Python 3.6 usando sockets "unsupported operand type(s) for +"

en mi anterior pregunta tuve un error con la clase socket y ahora tengo otro error

server

import socket

host = "127.0.0.1"
port = 6666

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print ("Socket Created")
sock.bind((host, port))
print ("socket bind complete")
sock.listen(1)
print ("socket now listening")

while 1:
    conn, addr = sock.accept()
    print ('Connected with ') + addr[0] + ':' + str(addr[1])

sock.close()

output

Socket Created
socket bind complete
socket now listening
Connected with

traceback (most recent call last):
file "server.py", line 18 in <module>
print("connected with") + addr[0] + ":" str(addr[1])
typeError : unsupported operand type(s) for +: 'NoneType' and 'str'

cliente

import socket

host = "127.0.0.1"
port = 6666

sock = socket.socket()

sock.connect((host, port))

while True:

  message = input("envia un mensaje")
  sock.send(message.encode('utf-8'))

  if message == "quit":
    break

  print("bye")
  sock.close()

1voto

carlossevi comentado

El error es tan fácil de interpretar que parece mentira que ya hayas hecho varias preguntas sobre Python... Revisa la sintáxis de la línea que te indica a ver si encuentras algún error.

0voto

steven comentado

no recuerdo haber hecho las mismas preguntas, si es asi te pido disculpas he retomado con python, sin embaro para mi no es tan facil de interpretar, no entiendo que hay de malo en esta linea

    print ('Connected with ') + addr[0] + ':' + str(addr[1])

0voto

Peter comentado

¿Sabes cual es el error?

0voto

steven comentado

negativo, cual puede ser segun tu

0voto

Peter comentado

¿No sabes cual es el error que tienes que corregir?

No me refiero a la solución, si no a que error te esta dando y que te dice el error.

1voto

carlossevi comentado

@Peter ha dado en el clavo: el error y su solución son dos cosas distintas. Para poder aprender de este error, necesitas entender cuál es, y no que simplemente te demos la solución. Céntrate en el mensaje:

traceback (most recent call last):
file "server.py", line 18 in <module>
print("connected with") + addr[0] + ":" str(addr[1])
typeError : unsupported operand type(s) for +: 'NoneType' and 'str'

0voto

steven comentado

segun el error no soporta algun operador, no entiendo cual de ellos y porque

0voto

carlossevi comentado

El error te está diciendo que el operador '+' no puede operar con los tipos 'NoneType' y 'str'. Busca dónde estás usando ese operador...

0voto

steven comentado

y que puedo hacer al respecto, cual seria el operardor nonetype

1 Respuesta

1voto

carlossevi Puntos63580

Que conste en acta que según los comentarios anteriores, no has gastado ni una gota de esfuerzo en entender el mensaje de error ni leer documentación.

El error te está diciendo que el operador '+' no puede operar con los tipos 'NoneType' y 'str'. Veamos los usos que haces del operador en la línea del error:

print ('Connected with ') + addr[0] + ':' + str(addr[1])
                          ^         ^     ^

Supongo que el tipo 'str' lo conoces, es la cadena de texto. ¿Qué es el tipo 'NoneType'? Pues precisamente es el tipo de variable de una variable que no tiene valor.

El mensaje de error te dice que no puedes "sumar" (utilizar el operador '+' de adición) a una cadena de texto un elemento con valor nulo. ¿Y por qué?

Porque estás estás intentando concatenar la cadena addr[0] con el valor devuelto por print ('Connected with ') ¡que no devuelve ningún valor!

Parece ser que tienes un error con los paréntesis y el orden que se hacen las operaciones, porque seguramente querrás hacer la concatenación antes de imprimir el mensaje, y no después.

print ('Connected with ' + addr[0] + ':' + str(addr[1]))

0voto

steven comentado

gracias por la explicacion me ayuda mucho, sin embargo todavia me bota otro error despues que envio dos mensajes al cliente desde el server, no puedo entender porque el metodo sent esta fallando

traceback(most recent call)
sock.send(message.encode('utf-8'))
oserror [winerror 10038] se intento realizar una operacion en un elemeno que no es socket

por casualidad sabes si hay una manera de guardar los errores que se van generando a lor largo del desarrollo en un fichero de texto y asi poder tener un registro de los errores

0voto

carlossevi comentado

Haber solucionado el error anterior no te garantiza la ausencia de errores futuros.

Respecto al error que tienes ahora: estás intentando hacer un send() sobre un elemento que YA no es un socket.

¿Por qué especifico el "YA"? Porque dentro de tu bucle while estás cerrando el socket con sock.close() con lo que no puedes volver a utilizarlo al inicio del bucle siguiente.

Respecto a "guardar los errores" te recomiendo el siguiente enlace.

0voto

steven comentado

en la busqueda solo aparece un resultado en español, como podria solucionar mi error principal

0voto

carlossevi comentado

@steven a cada pregunta y comentario alucino un poco más contigo, ¿seguro que no me estás vacilando? La búsqueda era una sugerencia, prueba a leer, buscar con otros términos o en dos búsquedas independientes.

Tu error lo puedes solucionar no cerrando el socket en cada iteración del bucle.

0voto

steven comentado

disculpa como dejo abierto mi socket, la idea es intercambiar mensajes desde cliente y servidor, la busqueda me sugiere que use el modulo login pero la doc esta en ingles y es muy complicado, creo que seria mas comodo de otra manera, porfa pasame el codigo correcto no tengo mucho terreno con python

0voto

carlossevi comentado

NO se trata de tener mucho terreno con Python ni de documentación complicada, se trata de entender LO MÍNIMO sobre cómo funciona un script.

¿Tu entiendes lo que hace cada línea de tu código? Si no es así, estudia hasta entenderlo, no puede dedicarte eternamente a hacer copia y pega de foros y lanzar preguntas aquí para que te corrijamos la sintáxis. TIENES QUE ENTENDERLO.

Tu código explicado:

# Inicia bucle infinito
while True:

    # Pide el mensaje a enviar y lo guarda en "message"
    message = input("envia un mensaje")
    # Envía el mensaje a través de "sock"
    sock.send(message.encode('utf-8'))

    # Si el mensaje es literalmente "quit", sale del bucle infinito
    if message == "quit":
        break

    # Imprime "bye"
    print("bye")
    # Cierra el socket
    sock.close()

Evidentemente, esto es incorrecto, porque estás imprimiendo "bye" y cerrando el socket en todos los casos. La corrección es que esa parte solo se ejecute en el caso de que el mensaje sea "quit".

while True:

    message = input("envia un mensaje")
    sock.send(message.encode('utf-8'))

    if message == "quit":
        break
        print("bye")    
        sock.close()

0voto

steven comentado

el codigo no lo he copiado de ningun foro tranquilo, lo he tomado de un canal de programacion en ingles es un tio que sabe mucho de python. por el momento no me bota ningun error pero los mensajes no llegan al server, que cosa debo modificar

0voto

carlossevi comentado

Da igual de dónde lo hayas copiado, lo importante es que lo has copiado sin entenderlo. El pecado es el mismo, y no he querido decir que un foro no pueda ser un sitio de referencia. Insisto: te falta una compresión mínima de la programación.

-1voto

steven comentado

si pero mi problema requiere minimo un nivel avanzado de programacion orientado a obejetos y a redes, entiendo que puede ser un poco aburrido responder a un novato pero recuerda que ya hemos casi terminado, lo unico que falta es comunicar el server con el cliente, esto es mi ultimo deseo

0voto

carlossevi comentado

Si considerase aburrido responder a un novato, no estaría aquí respondiendo preguntas. El problema no es que seas novato, no te confundas. El problema, repito una y mil veces, es que no tratas de estudiar ni entender lo que se te dice. En esta pregunta, ya he respondido a tu problema, no más deseos.

0voto

steven comentado

si pero el codigo no hace nada mas que imprimir los mismos mensajes, asi no puede terminar, dame almenos una pista para seguir, porque no puedo responder desde mi servidor

0voto

Peter comentado

El problema es que no sabes ni lo que tiene que hacer el código, como hacerlo, ni porque hacerlo... Entonces si no tienes ni idea de ninguna de las partes mas importantes, ¿que caso tiene decirte otras?

1voto

carlossevi comentado

@steven he cambiado el título a tu pregunta para que se corresponda con el contenido de la misma, ya que en realidad el error no tenía nada que ver con sockets.

Si tienes más preguntas derivadas, ya sabes, puedes hacerlas.
Si la actual está resuelta, márcala como tal por favor.

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta