Foros del Web » Programando para Internet » Python »

Temita con sockets

Estas en el tema de Temita con sockets en el foro de Python en Foros del Web. Hola, vengo a traerles una preguntita a ver si me pueden ayudar ya que es la primera vez que trabajo con sockets y bueno, las ...
  #1 (permalink)  
Antiguo 07/01/2010, 17:54
 
Fecha de Ingreso: enero-2010
Mensajes: 9
Antigüedad: 14 años, 10 meses
Puntos: 0
Temita con sockets

Hola, vengo a traerles una preguntita a ver si me pueden ayudar ya que es la primera vez que trabajo con sockets y bueno, las cosas no me están saliendo como quiero. Parte del código es este:

Código:
import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)   
s.bind((socket.gethostname(), 8000))   
s.listen(5)
sc, addr = s.accept()   

sc.send("Introduce el Nombre de tu personaje: ")
nombre = sc.recv(1024)

#para probar que esto salga:

print nombre
sc.send(nombre)

Me conecto via telnet y la cosa es que cuando debo ingresar el dato por teclado, al ingresar un caracter ya me lo pone como que fue lo ingresado. Lo que yo necesito es poder ingresar toda una cadena y finalizar con un enter el ingreso.

Alguna idea? Cualquier sugerencia se los voy a agradecer mucho.

Gracias!
  #2 (permalink)  
Antiguo 07/01/2010, 19:39
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 8 meses
Puntos: 1360
Respuesta: Temita con sockets

Un pequeño ejemplo del servidor
Código Python:
Ver original
  1. #servidor.py
  2. import socket
  3.  
  4. s = socket.socket()
  5. s.bind(("localhost", 9999))
  6. s.listen(1)
  7.  
  8. sc, addr = s.accept()
  9.  
  10. while True:
  11.       recibido = sc.recv(1024)
  12.       recibido = rebido.replace("\r\n", "")
  13.       if recibido == "quit":
  14.          break
  15.       print "Recibido:", list(recibido)
  16.       sc.send(recibido)
  17.  
  18. print "adios"
  19.  
  20. sc.close()
  21. s.close()

Código del cliente
Código Python:
Ver original
  1. #cliente.py
  2. import socket
  3.  
  4. s = socket.socket()
  5. s.connect(("localhost", 9999))
  6.  
  7. while True:
  8.       mensaje = raw_input("> ")
  9.       s.send(mensaje)
  10.       if mensaje == "quit":
  11.          break
  12.  
  13. print "adios"
  14.  
  15. s.close()
No se a que te referías con lo del telnet, hasta que tuve la idea de usarlo de cliente.

Te recomiendo leer este post, que fue de donde lo saque.
  #3 (permalink)  
Antiguo 07/01/2010, 20:50
 
Fecha de Ingreso: enero-2010
Mensajes: 9
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Temita con sockets

Muchas gracias por la respuesta!

Bien, el tema es que sigue enviando y mostrando de a un caracter

Acá por ejemplo cada vez que pongo un caracter me lo repite porque me lo muestra:

[URL="http://img109.yfrog.com/i/deauna.jpg/"]http://img109.yfrog.com/i/deauna.jpg/[/URL]

Mi idea era más pasarle un string.
  #4 (permalink)  
Antiguo 08/01/2010, 08:32
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Temita con sockets

Si estás programando un servidor que funcione con telnet, el enviar caracter por caracter es el comportamiento esperado. Así es como funciona telnet (y su sucesor SSH)

Así que, es el cliente el que está enviando caracter por caracter en vez de todo el "comando" de una vez.

Si tu intención es leer desde el servidor una cadena entera, me parece que lo mejor será un bucle while que lea caracteres hasta encontrarse con un salto de línea, y luego pase lo leído a la función que debería procesarlo.


Saludos.
  #5 (permalink)  
Antiguo 08/01/2010, 09:28
 
Fecha de Ingreso: enero-2010
Mensajes: 9
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Temita con sockets

Cita:
Iniciado por AlvaroG Ver Mensaje
Si estás programando un servidor que funcione con telnet, el enviar caracter por caracter es el comportamiento esperado. Así es como funciona telnet (y su sucesor SSH)

Así que, es el cliente el que está enviando caracter por caracter en vez de todo el "comando" de una vez.

Si tu intención es leer desde el servidor una cadena entera, me parece que lo mejor será un bucle while que lea caracteres hasta encontrarse con un salto de línea, y luego pase lo leído a la función que debería procesarlo.


Saludos.
Gracias, pensaba en eso como alternativa pero veo que es la única solución.

Muchas pero muchas gracias!!!!
  #6 (permalink)  
Antiguo 11/01/2010, 14:15
 
Fecha de Ingreso: enero-2010
Mensajes: 9
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Temita con sockets

Casi lo tengo, ahora, como hago que me reconozca el salto de linea? Como veo que la tecla apretada sea un return?

Gracias!!!!
  #7 (permalink)  
Antiguo 11/01/2010, 14:47
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Temita con sockets

Quizás puedas ver si el caracter que recibes es "\n" o "\r"
O que ord(caracter) sea 10, que es el código del caracter de línea nueva (\n)

Quizás te sirva -> http://en.wikipedia.org/wiki/Ascii


Saludos.
  #8 (permalink)  
Antiguo 11/01/2010, 14:51
 
Fecha de Ingreso: enero-2010
Mensajes: 9
Antigüedad: 14 años, 10 meses
Puntos: 0
Respuesta: Temita con sockets

Gracias, pongo acá la solución como quedó, a lo mejor le sirve a alguien:

Código:
nombre=""
sc.send("Introduce el Nombre de tu personaje: ")
flag_salida=1
while flag_salida==1:
    dato=str(sc.recv(1))
    
    if dato!="\n":
        nombre = nombre+str(dato)
        print nombre
    else:
        flag_salida=0
Saludos.

Etiquetas: sockets
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:38.