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]

0voto

Peter comentado

¿Que problema?

0voto

steven comentado

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

0voto

Peter comentado

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.

0voto

steven comentado

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 Puntos63540

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.

0voto

steven comentado

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

1voto

carlossevi comentado

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

0voto

steven comentado

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

1voto

carlossevi comentado

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/

0voto

steven comentado

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

1voto

carlossevi comentado

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.

0voto

steven comentado

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**

0voto

carlossevi comentado

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.

0voto

steven comentado

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

0voto

carlossevi comentado

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.

0voto

steven comentado

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

0voto

carlossevi comentado

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

0voto

steven comentado

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

0voto

carlossevi comentado

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.

0voto

steven comentado

en que nivel deberia ir

0voto

carlossevi comentado

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

0voto

steven comentado

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

0voto

carlossevi comentado

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

0voto

steven comentado

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

0voto

carlossevi comentado

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.

0voto

steven comentado

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

0voto

carlossevi comentado

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

0voto

steven comentado

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

0voto

carlossevi comentado

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.

0voto

steven comentado

las tabulaciones son el punto a parte verdad

0voto

carlossevi comentado

0voto

steven comentado

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

1voto

carlossevi comentado

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.

0voto

steven comentado

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

0voto

magarzon comentado

@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.

0voto

steven comentado

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.

Otras Preguntas y Respuestas


...

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

Conecta