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

-2votos

alguien que sepa como se trabaja con sockets

hola muchahos tengo un problema con mi siguiente codigo

import socket

host = "127.0.0.1"
port = 5000

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "Socket Created"
#porque debo poner dos parentesis
sock.bind((host, port))
print "socket bind complete"
sock.listen(1)
print "socket now listening"

while 1:
    #porque hay dos variables con y addr 
    #wait to accept a connection - blocking call
    conn, addr = sock.accept()
    print 'Connected with ' + addr[0] + ':' + str(addr[1])
    #porque hay dos arrays distintos y una subcadena

sock.close()

mensaje de error

Traceback (most recent call last):
File "C:\Documents and Settings\antony\Desktop\test\ServerTcp.py", line 8, in <module>
sock.bind((host, port))
File "C:\Python27\lib\socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
error: [Errno 10048]

Peter comentado Feb 5

¿Que problema?

steven comentado Feb 6

tengo un problema de conexion con mi aplicacion cliente/servidor
puedes ver en mi ultima respuesta a esta pregunta el error

Peter comentado Feb 6

Si, vi el primer error cuando editaste la pregunta incluyéndolo después de que lo pregunte.

Pero veo que no tienes un problema concreto a solucionar y estas probando cosas para ver como funcionan.

Cada cosa que pruebas te sale otro error y así sucesivamente será si no estas intentando hacer nada.

Es decir:

  • Estoy creando un listado de usuarios que llamo desde mi base de datos.
  • Mi base de datos tiene estas tablas: (código)
  • Mi script es este: (código)
  • El error que me da es este: (código)

Eso tendría sentido, sin embargo tu pregunta (como las otras) no es para lograr darle solución a nada, simplemente pones códigos unos tras otros de pruebas que haces sin que se pueda llegar a una solución a "algo", porque ese algo no existe.

Y es ese basicamente el porque es complicado ayudarte.

Estaría bien que leas la documentación, desarrolles tu código para "Lograr un objetivo o tarea" y si en ello tienes un error, plantearlo.

Saludos.

steven comentado Feb 6

ok peter te prometo que la proxima vez que pregunte algo tratare de ser lo mas preciso y explicito posible respecto a mi pregunta corriente creo que me olvide mencionar que es lo que queria hacer aqui te lo explico
quiero una minichat en local que haga uso de los sockets y quiero que sea de dos tipos uno para tcp y uno para udp luego me gustaria conocer los otros metodos del objeto socket he visto que hay muchos incluso uno para conectar con bluetooth
en fin estoy solo tratando de aprender y probar cosas nuevas

1 Respuesta

1voto

carlossevi Puntos58820

El error número 10048 en los códigos de error de Sockets de Windows se corresponde con "Address already in use", es decir, que el puerto ya está en uso.

Prueba con otro puerto.

steven comentado Feb 6

listo ya tengo mi servertcp ahora solo me falta crear el client por el momento necesito terminar mi cliente

Tcp 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:

    #wait to accept a connection - blocking call
    conn, addr = sock.accept()
    print 'Connected with ' + addr[0] + ':' + str(addr[1])

sock.close()

Tcp client que cosa le falta a mi codigo para que funcione

import socket

host = "127.0.0.1"
port = 6666

client = socket.connect(host,port)
message = raw_input("envia un mensaje")

nota he probado mi server tcp con el telnet de windows pero no puedo enviar ningun mensaje a pesar de establoecer una conexion
aparte de esto no entiendo porque se cambia de puerto

carlossevi comentado Feb 6

Te copio un ejemplo de código cliente-servidor con sockets y Python:

servidor.py

import socket

s = socket.socket()
s.bind(("localhost", 9999))
s.listen(1)

sc, addr = s.accept()

while True:
    recibido = sc.recv(1024).decode('utf-8')
    if recibido == "quit":
        break
    print ("Recibido:", recibido)
    sc.send(recibido.encode('utf-8'))

print ("adios")

sc.close()
s.close()

cliente.py

import socket

s = socket.socket()
s.connect(("localhost", 9999))

while True:
    mensaje = input("> ")
    s.send(mensaje.encode('utf-8'))
    if mensaje == "quit":
        break

print ("adios")
s.close()

steven comentado Feb 6

tengo el mismo error con el puerto a pesar que ya cerre mi script sigue en la lista de conexiones

Proto Indirizzo locale Indirizzo esterno Stato
TCP acer:epmap 0.0.0.0:0 LISTENING
TCP acer:microsoft-ds 0.0.0.0:0 LISTENING
TCP acer:3389 0.0.0.0:0 LISTENING
TCP acer:1028 0.0.0.0:0 LISTENING
TCP acer:1035 localhost:1036 ESTABLISHED
TCP acer:1036 localhost:1035 ESTABLISHED
TCP acer:1296 localhost:1306 ESTABLISHED
TCP acer:1306 localhost:1296 ESTABLISHED
TCP acer:1517 0.0.0.0:0 LISTENING
TCP acer:1517 localhost:1526 ESTABLISHED
TCP acer:1526 localhost:1517 ESTABLISHED
TCP acer:6666 0.0.0.0:0 LISTENING
TCP acer:6666 localhost:1402 CLOSE_WAIT
TCP acer:netbios-ssn 0.0.0.0:0 LISTENING
TCP acer:1304 linode2.wbond.net:https CLOSE_WAIT
TCP acer:1516 209-20-75-76.slicehost.net:https CLOSE_WAIT

carlossevi comentado Feb 6

Seguramente hayas terminado tu aplicación sin haber cerrado las conexiones. Estas líneas son importantes:

sc.close()
s.close()

Más info: https://blogs.technet.microsoft.com/janelewis/2010/03/09/explaining-close_wait/

steven comentado Feb 6

he seguido al pie de la letra las instrucciones y obtengo otro error

el script para mi servidor tcp funciona correctamente pero el script para mi cliente tcp retorna un error desconocido

script cliente tcp

import socket

host = "127.0.0.1"
port = 6666

sock = socket.socket()

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

while true:

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

  if message == "quit":
    break

  print("bye")
  sock.close()

respuesta

traceback (most recent call last):
file "TcpClient.py", line 8, in <module>
sock = socket.connect((host, port))
AttributeError : module 'socket' has no attribute 'connect'

nota uso la version 3.6 de python

carlossevi comentado Feb 7

Mensaje de error en línea 8: "module 'socket' has no attribute 'connect'"

Efectivamente tienes un error, tu línea:

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

Debería ser:

sock.connect((host, port))

connect() es un método de la clase socket pero necesita una instancia de la clase (un objeto), no es un método genérico.

steven comentado Feb 7

ok ya lo corregi pero todavia sigo teniendo errores en este caso lanzo el servidor y despues que lanzo el ciente occure un error en el servidor

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()

servidor aviso de sublime error line 18 in <module>

import socket

host = "127.0.0.1"
port = 6666

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print ("Socket Created")
#non ho capito perche ci vogliono due parentesi
sock.bind((host, port))
print ("socket bind complete")
sock.listen(1)
print ("socket now listening")

while 1:
    #qui non ho capito perche ci sono due variable separate per virgola
    #wait to accept a connection - blocking callB
    conn, addr = sock.accept()
    print ('Connected with ') + addr[0] + ':' + str(addr[1])
    #non ho capito nemmeno perche racchiude in un array le variabli

sock.close()

**error por parte del servidor despues de inciar el cliente

Traceback (most recent call last):
File "ServerTcp.py", line 18, in <module>
print('Connected with ') + addr[0] + ':'str(addr[1])

TypeError: unsupported operand type(s) for +: 'Nonetype' and 'str'

error lanzado por el cliente

Traceback (most recent call last):
File "TcpClient.py", line 10, in <module>
while true:

NameError: name 'true' is not defined**

carlossevi comentado Feb 7

Revisa tu código y lee los errores porque es un problema de sintáxis. No puedes usar el operador + entre una cadena y el resultado de un print(). Tienes un problema con los paréntesis.

steven comentado Feb 7

chequea la sintaxis de mi servidor y del cliente

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()

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()```

carlossevi comentado Feb 7

La línea es incorrecta:

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

Prueba a cambiarla por:

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

De todas formas, si vas a comentar la respuesta con cada error de sintáxis de tu código, ya nos podemos preparar.

Creo que el funcionamiento básico del socket está claro, a partir de ahí puedes pelearte y aprender Python.

steven comentado Feb 7

bueno ya esta casi terminado por favor no te molestes no hago preguntass muy frecuente. ahora tengo otro error con mi cliente no entiendo la razon

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()

output

 error lanzado por el cliente

 Traceback (most recent call last):
  File "TcpClient.py", line 10, in <module>
   while true:

 NameError: name 'true' is not defined

nota : no entiendo porque cuando se establece una conexion cambia de puerto si en mi servidor he especifado que sea por el 6666

carlossevi comentado Feb 7

Trata de acostumbrarte a leer la pila del error, ya que te dice la línea y el mensaje.

Línea con el error:

while true:

Mensaje de error:

NameError: name 'true' is not defined

Problema: no se reconoce true porque en Python True se escribe en mayúscula. Prueba con while True:.

steven comentado Feb 7

gracias ahora si funciona mi script pero todavia hay un error con la aplicacion
es decir cuando estoy en mi cliente y envio un mensaje se sale del ciclo while
y me devuelve el mensaje por defecto de salida 'bye' aparte no entiendo porque cambia de puerto al 1183 cada vez que ejecuto mi cliente siempre cambia de puerto podrias explicarme porque razon cambia siempre de puerto si tengo asignado el puerto 6666 para mi servidor.

cliente funcionante

import socket

host = "127.0.0.1"
port = 6666

sock = socket.socket()

#podrias explicarme porque se usan doble parentensis 
sock.connect((host, port))

while True:

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

  if message == "quit":
    break

  print("bye") #esto deberia mostrarlo solo si escribo quit en consola
sock.close()

por ultimo he notado algo curioso si supuestamente me manda el mensaje de salida deberia cortar la conexion con mi servidor sin embargo esto no pasa ni en el cliente ni en el servidor, es mas para cerrar mi servidor debo hacerlo desde la consola con el comando netstat

carlossevi comentado Feb 7

Revisa la indentación del código porque NO es cierto que el "bye" deba imprimirse solo en caso de que el mensaje sea "quit", al menos en el código que nos has pegado.

steven comentado Feb 7

en que nivel deberia ir

carlossevi comentado Feb 7

Al nivel que está siempre se ejecutará en cada ciclo del while.

Si quieres que se ejecute dentro del if debería estar un nivel más adentro, si quieres que se ejecute al final, antes del cierre (al salir del bucle), debería estar un nivel más afuera.

Te dejo una documentación interesante:
https://docs.python.org/3/tutorial/introduction.html

steven comentado Feb 7

nada me devuelve un error de indentancio he probado de las siguientes maneras

while True:

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

  if message == "quit":
    break

  print("bye")
sock.close()
while True:

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

  if message == "quit":
    break

   print("bye")
sock.close()
while True:

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

  if message == "quit":
     break

     print("bye")
sock.close()
while True:

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

  if message == "quit":
   break

    print("bye")
sock.close()

carlossevi comentado Feb 7

Me remito a que aprendas lo básico sobre Python.

steven comentado Feb 7

vamos tio no seas asi necesito en este momento una solucion ya llevo varios dias probando, por favor este es la ultima cosa que te pido despues no te molestare jamas, para mi es un poco dificil aplicar las indentaciones en ciertos casos por ejemplo si tengo un codigo como el siguiente
primera tipo de indentacion
cond

mi codigo puede ir despues de un espaciado

cond
_____ o puede ir despues de un largo espaciado

cond
_____puede ir en cualquier lugar siempre y cuando este por debajo
eso no lo comprendo bien, no se me ocurrio otro ejemplo para explicarme

esto es lo que no me convence mucho es

carlossevi comentado Feb 7

No es que sea de ninguna forma. Comprender la indentación de Python es TAN básico para utilizarlo que no tiene sentido querer aprender sockets o cualquier otro fundamento.

Tienes que respetar el mismo tipo de indentación en el mismo fichero, o espacios (4 espacios) o tabuladores. Seguramente el error (que no has compartido) viene por haberlos mezclado.

steven comentado Feb 7

esto significa que hay un minimo y un maximo de tabulaciones que esta permitido
por ejemplo si el tengo esto

cond
1tab sentencia

cond
4tabs sentencia

cond
10tabs sentencia

con esto creo que todos funcionarian porque estan debajo de la condicion principal

ahora no se si cuando copio y pego mi codigo en este editor se pueden ver todas las tabulaciones, creo que si porque si no me hubiese llegado a iniciar mi servidor ni mi cliente no lo crees

carlossevi comentado Feb 7

No se puede saltar más de un nivel de indentación de golpe, después de un if, for, while... se incrementa un nivel. Se pueden encadenar "infinitos" niveles, pero estos no se suben de golpe.

Te copio un trozo de un tutorial:

El código Python se escribe en cada línea desde la primera posición excepto cuando es necesario dejar el código sangrado. El sangrado en Python es obligatorio, se hace con espacios en blanco o saltos de tabulación y sirve para agrupar bloques de líneas de código que tienen relación a distintos niveles. Se utiliza con estructuras de control (if-else, while, for), con funciones y clases. Además, permite que la lectura del código sea cómoda y agradable.
El sangrado se puede hacer con espacios y tabulaciones pero ambos tipos no se pueden mezclar.
Es posible sangrar con un único espacio en blanco pero lo normal es utilizar un número de espacios múltiplo de cuatro en cada nivel de sangrado (cuatro, ocho, doce espacios, etc.), o bien, distinto número de saltos de tabulación.

Fuente: http://python-para-impacientes.blogspot.com.es/p/indice.html

steven comentado Feb 7

esto significa que las lineas en blanco y los espaciados por tabulador se cuenta
por ejemplo no es lo mismo

cond
1tab sentencia

cond

1tab sentencia

eso fue lo que entendi y creo que esto causa el error no es asi

carlossevi comentado Feb 7

Las líneas en blanco a no ser que tengan caracteres extraños no provocan errores. Como te digo, habrás mezclado tabuladores y espacios al copiar código de diversas fuentes. Configura tu editor de texto/código para que muestre los caracteres especiales (tabuladores y espacios) y comprueba que tu código es uniforme.

steven comentado Feb 7

las tabulaciones son el punto a parte verdad

carlossevi comentado Feb 7

NO, la tabulación es https://es.wikipedia.org/wiki/Tabulador

steven comentado Feb 7

las tabulaciones no son mas que un espacio mayor son lo mismo que la sangria
acabo de instalar el ide anaconda para mi editor sublime pero no puedo ver los espacios ademas tengo un error extraño aqui te lo paso

aviso

enter image description here

carlossevi comentado Feb 7

Lo siento, esto no es un servicio técnico ni un chat.

Si tienes dudas sobre programación abre nuevas preguntas intentando concretar los temas tal y como te dijo Peter en este comentario.

Yo por mi parte he terminado de ampliar información a mi respuesta al problema de los sockets.

steven comentado Feb 7

disculpa fue tonto por mi parte querer una respuesta para el problema con mi plugin no te lo tomes a pecho tampoco, sin embargo todavia no logro entender el conflicto que hay entre indentancion y espacion si ambos son lo mismo

magarzon comentado Feb 7

@steven, en el tiempo que llevas preguntando en esta web, ya te he visto preguntar casi por más tecnologías que las que haya podido ver yo en 20 años, y todo eso sin tener ni siquiera una base sólida de programación ni un mínimo nivel de inglés para saber qué significan los errores que te dan, que algunos son bien claros y suficientemente explicativos, y si no, con una simple búsqueda en Google puedes obtener la solución.

Y encima es que además no pones nada de esfuerzo, al primer error que te sale ya estás preguntando aquí, no eres capaz de probar, investigar, etc.

Ya somos varios los que te hemos recomendado que consigas primero una buena base de programación, después apuestes por una tecnología que te guste, y no vayas probando cosas porque las lees en algún sitio. Y sobre todo, no estamos aquí de soporte técnico, como dice @carlossevi. Estamos aquí para resolver problemas, pero contigo es como si te debiéramos algo, como si tuviéramos que dedicar nuestro tiempo para ti por algún motivo que se me escapa.

steven comentado Feb 7

estimado @magarzon debo admitir que a veces soy un poco impaciente y no puedo controlar mis ganas de aprender y de hacer preguntas por cualquier argumento pero debes saber que si para mi fuera sencillo encontrar una solucion no vendria a esta pagina a preguntar debes saber que trato de empeñarme al maximo en aprender pero tengo dificultades y ostaculos como autodidacta es muy dificil formarse
te confieso que todos los dias de la semana y gran parte del dia lo dedico a estudiar y mirar videos de programacion y tecnologias actualmente estoy siguiendo algunos canales populares que quizas conoscas estos son codigofacilito, codejobs, platzi, escueladigital y pildoras informaticas, para mi criterio son los canales mas importantes del youtube hispano que ofrecen contenido de calidad.

para ponerte un caso te cuento que estos ultimos dias me pase muchas horas tratando de entender y programar un socket es mas solo con decirte que me estuve toda la noche mirando un video tras otro buscando un ejemplo practico y en ingles se me hace dificil, lastima que ninguno de ellos funcionaba y en todos los videos lo hacian de una manera distinta que no se entendia ni jota.

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

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Actividad Reciente

¿Eres Usuario Apple?

...

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

Conecta