elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  [Sin resolver]-[Python]Problema con sockets
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Sin resolver]-[Python]Problema con sockets  (Leído 5,636 veces)
Arnau27

Desconectado Desconectado

Mensajes: 46



Ver Perfil WWW
[Sin resolver]-[Python]Problema con sockets
« en: 10 Julio 2012, 19:08 pm »

 Bueno, empezé a conocer los sockets y lo primero que intenté hacer fue un socket cliente servidor en el que el cliente enviara strings y el servidor las pintara. Me costó lo suyo ya que parece que sino todos, la mayoria de la gente en internet usa python 2.7, y se ve que a partir de la 3.0 hay que passar strings a bytes para poder enviarlo puesto que no se pueden mezclar bytes y strings.

Despues de esto pense en hacer un chat ya que estaba jugando con strings y sockets...Bueno pues como siempre debe haber cliente y servidor, apliqué los pocos conceptos que tengo y hice 2 scripts que fueran cliente y servidor a la vez para asi establecer 2 sockets y hacer el chat. Pero como un programa no puede ser cliente y servidor a la vez planteo esta situación:

Con una estructura de 1 servidor y muchos clientes, los clientes envian bytes al servidor y el servidor envia estos bytes a un cliente. Como, usando python y solo con el modulo socket, puedo hacer esto?
En caso de que la estructura que he planteado no sea como deberia ser corrijanme porfavor.

He leido que la gente usa threads pero quiero hacerlo solo con el modulo socket...

Gracias


« Última modificación: 25 Julio 2012, 09:41 am por Arnau27 » En línea

La confianza es la base de la elegancia.
oxydec

Desconectado Desconectado

Mensajes: 42



Ver Perfil
Re: [Python]Problema con sockets
« Respuesta #1 en: 15 Julio 2012, 03:46 am »

¿Podrias poner el codigo que has hecho del cliente y servidor para poder ayudarte mejor?

A nivel abstracto creo que lo que quieres hacer se haria del siguiente modo:

- El servidor tiene un socket escuchando conexiones entrantes
- El servidor ejecuta un bucle, a cada iteracion:
- Mira si le entra una conexion por el socket a la escucha.
- Cuando le llega una conexion de un cliente crea un nuevo socket unico para ese cliente y lo añade a una lista de clientes.
- Recorre la lista de clientes a ver si alguno ha enviado algo.
- Si ha enviado algo le manda el mensaje recibido a los demas clientes de la lista.

Esto es con un solo hilo como has pedido, si lo haces con threads en vez de una lista sockets para cada cliente/conexion tendrias un hilo para cada cliente/conexion.


En línea

Arnau27

Desconectado Desconectado

Mensajes: 46



Ver Perfil WWW
Re: [Python]Problema con sockets
« Respuesta #2 en: 17 Julio 2012, 20:08 pm »

¿Podrias poner el codigo que has hecho del cliente y servidor para poder ayudarte mejor?

A nivel abstracto creo que lo que quieres hacer se haria del siguiente modo:

- El servidor tiene un socket escuchando conexiones entrantes
- El servidor ejecuta un bucle, a cada iteracion:
- Mira si le entra una conexion por el socket a la escucha.
- Cuando le llega una conexion de un cliente crea un nuevo socket unico para ese cliente y lo añade a una lista de clientes.
- Recorre la lista de clientes a ver si alguno ha enviado algo.
- Si ha enviado algo le manda el mensaje recibido a los demas clientes de la lista.

Esto es con un solo hilo como has pedido, si lo haces con threads en vez de una lista sockets para cada cliente/conexion tendrias un hilo para cada cliente/conexion.

Aqui tienes el codigo, he echo más pero el unico que me ha funcionado es el mas simple.
Código
  1. #Cliente
  2. import socket
  3. s=socket.socket()
  4. try:
  5. s.connect(("localhost", 9999))
  6. except socket.error:
  7. print("Socket error")
  8.  
  9. while True:
  10. inp=input(" >>  ")
  11. encode=str.encode(inp)
  12. if inp=="quit":
  13. s.close()
  14. quit()
  15. print("bye")
  16. else:
  17. s.send(encode)
Código
  1. #Servidor
  2. import socket  
  3.  
  4. s=socket.socket()  
  5. s.bind(("localhost", 9999))  
  6. s.listen(3)  
  7. print("Waiting...")
  8. sc, addr=s.accept()  
  9. print("Socket established")    
  10. while True:
  11. r=sc.recv(1024)
  12. dc=bytes.decode(r)
  13. print(" -  ", dc)
  14. if r=="quit":
  15. sc.close()
  16. s.close()
  17. quit()
Me has entendido a la perfección, gracias.
En línea

La confianza es la base de la elegancia.
oxydec

Desconectado Desconectado

Mensajes: 42



Ver Perfil
Re: [Python]Problema con sockets
« Respuesta #3 en: 17 Julio 2012, 23:10 pm »

He estado investigando un poco porque me parece interesante el tema, y veo que hacerlo sin threads es complicado, el problema es que la funcion socket.accept() bloquea la ejecucion en ese punto hasta que recibe una conexion, normalmente lo que se hace es que en el hilo de ejecucion principal tienes un bucle infinito haciendo accepts y abriendo un nuevo thread cuando llega una conexion, o tal vez se pueda hacer con solo 2 threads, uno para los accepts y otro gestionando las conexiones abiertas.

Ahora bien si quieres hacerlo con un unico hilo hay una solucion que es usar el modulo select, concretmente la funcion select.select(), que lo que hace es como observar un conjunto de datos y lanzar "eventos" cuando alguno de los datos es modificado: aqui hablan del tema http://stackoverflow.com/questions/5308080/python-socket-accept-nonblocking
y aqui tienes la documentacion http://docs.python.org/library/select.html#select.select

Si descubro algo mas ya te informo.

Saludos.
« Última modificación: 17 Julio 2012, 23:17 pm por oxydec » En línea

Arnau27

Desconectado Desconectado

Mensajes: 46



Ver Perfil WWW
Re: [Python]Problema con sockets.
« Respuesta #4 en: 22 Julio 2012, 20:37 pm »

He estado investigando un poco porque me parece interesante el tema, y veo que hacerlo sin threads es complicado, el problema es que la funcion socket.accept() bloquea la ejecucion en ese punto hasta que recibe una conexion, normalmente lo que se hace es que en el hilo de ejecucion principal tienes un bucle infinito haciendo accepts y abriendo un nuevo thread cuando llega una conexion, o tal vez se pueda hacer con solo 2 threads, uno para los accepts y otro gestionando las conexiones abiertas.

Ahora bien si quieres hacerlo con un unico hilo hay una solucion que es usar el modulo select, concretmente la funcion select.select(), que lo que hace es como observar un conjunto de datos y lanzar "eventos" cuando alguno de los datos es modificado: aqui hablan del tema http://stackoverflow.com/questions/5308080/python-socket-accept-nonblocking
y aqui tienes la documentacion http://docs.python.org/library/select.html#select.select

Si descubro algo mas ya te informo.

Saludos.
Muchas gracias, pero al probar el ejemplo de stackoverflow no entiendo por que me da error, no consigo entender por que. Te dejo el cliente y servidor y más abajo el problema :S.

Servidor
Código
  1. import socket, select
  2.  
  3. s=socket.socket()  
  4. s.bind(("localhost", 9999))  
  5. s.listen(3)  
  6. input=[s]
  7. print("0")
  8. while True:
  9. inp, out, exc=select.select(input,[] ,[])
  10. for x in inp:
  11. if x is s:
  12. print("1")
  13. c, addr=s.accept()
  14. input.append(c)
  15. else:
  16. data=s.recv(1024)
  17. if data:
  18. dc=bytes.decode(data)
  19. print(s.getpeername(), " -  ", dc)
  20. x.send(data)
  21. else:
  22. s.close()
Cliente
Código
  1. import socket
  2. s=socket.socket()
  3. try:
  4. s.connect(("localhost", 9999))
  5. except socket.error:
  6. print("Socket error")
  7.  
  8. while True:
  9. data=input(" >>  ")
  10. encode=str.encode(data)
  11. if data=="quit":
  12. s.close()
  13. quit()
  14. print("bye")
  15. elif data=="get*":
  16. inp=s.recv(1024)
  17. dc=bytes.decode(inp)
  18. print(dc)
  19. else:
  20. s.send(encode)

Bueno resulta que al enviar alguna cosa desde el cliente, el servidor salta diciendo que no hay un socket establezido, que no esta conectado. He comprobado, como puedes ver en el script del servidor, que el programa pasa por aceptar la conexion asi que no entiendo el problema. Espero que alguien pueda ayudar, gracias.
« Última modificación: 25 Julio 2012, 09:38 am por Arnau27 » En línea

La confianza es la base de la elegancia.
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
como dando ordenes a través sockets en Python?
Scripting
Shrick 0 2,132 Último mensaje 28 Diciembre 2008, 18:09 pm
por Shrick
[Python] Sockets en Python [+Ejemplos y Ejercicios]
Python
Erik# 4 15,201 Último mensaje 4 Abril 2013, 16:43 pm
por SelTzeR
Python + Sockets
Scripting
anarquistadel89 5 5,814 Último mensaje 3 Diciembre 2009, 04:01 am
por pucheto
[Ayuda]Problema en la identificación de los sockets[Python]
Scripting
Moroso 0 2,171 Último mensaje 19 Agosto 2010, 22:56 pm
por Moroso
[PYTHON]Bajar Codigo Fuente de una Web(Con SOCKETS)
Scripting
mr.blood 0 4,888 Último mensaje 11 Enero 2011, 19:17 pm
por mr.blood
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines