Hola, no consigo de ninguna forma lanzar un socket TCP con GServer y
especificar que me lea N caracteres en total (pueden ser varias lÃneas
seguidas).
Un ejemplo de los datos que recibo es (supongamos que suman 55
caracteres):
a=12312132
b=sdsd lskdjdslkj ds
c=qwe qwoei qweoiuqw eoiqwue
d=qweqwe qoweiu
Yo sé de antemano el número exacto de caracteres que voy a recibir (55),
pero
no veo qué método usar para capturar todos y almacenar toda la info en
una
variable. He intentado con todos los métodos que he visto pero lo mejor
que
he conseguido es algo como:
def serve(io)
if IO.select([io], nil, nil)
io.each do |linea|
datos = datos << linea
end
end
end
Con eso obtengo un array de String’s, pero no puedo controlar el
capturar
EXACTAMENTE 55 caracteres, y esto es condición imprescindible pues debo
saber
cuándo he leÃdo esos 55 caracteres y no leer NADA más (pero podrÃa haber
más
y no lo quiero).
¿Hay alguna forma?
Gracias.
Hola Iñaki, una solución rápida que se me ocurrió es la siguiente:
def serve(io)
if IO.select([io], nil, nil)
stream = io.to_s[0…54]
lines = stream.split(“\n”)
lines.each do |linea|
datos = datos << linea
end
end
end
Ojalá te sirva.
Saludos.
El dÃa 8/03/08, Iñaki Baz C. [email protected] escribió:
2008/3/9 Ruben. D. [email protected]:
end
Yo sé de antemano el número exacto de caracteres que voy a recibir (55),
end
Desconozco que es un Gserver y que clase es exactamente io, pero si es
un objeto tipo IO tienes el método read:
io.read(55) # lee 55 bytes (que no carácteres) nada más.
Suerte.
El Domingo, 9 de Marzo de 2008, Daniel R.
Troitiño escribió:
Desconozco que es un Gserver y que clase es exactamente io,
GServer es una clase que provee de un TCPSocket con manejo de threads y
demás,
todo “sin tener ni idea” XD
Por ejemplo:
Build a Chat Server in Minutes with Ruby and GServer
pero si es
un objeto tipo IO tienes el método read:
io.read(55) # lee 55 bytes (que no carácteres) nada más.
Cierto, de hecho lo había probado pero me fallaba. Ahora ya
sé porqué:Resulta que si en una conexión TCP (un Telnet por ejemplo) pulsas Intro
estás
generando 2 caracteres: CR y LF, y yo había contabilizado sólo uno, de ahí mi
error.
Muchas gracias, funciona.
PD: Una cosilla (reconozco que aún no lo he buscado), ¿cómo podría hacer para
limitar el tiempo que se queda esperando a recibir con io.read(55) esos
55
bytes?
2008/3/9 Iñaki Baz C. [email protected]:
de hacer el “io.read(N)” y cuando se dispare llamar al método io que elimina
la conexión.
–
Iñaki Baz C.
Ror-es mailing list
[email protected]
simplelogica.net
En la librería estándar tienes el módulo timeout:
http://ruby-doc.org/stdlib/libdoc/timeout/rdoc/index.html
Suerte.
El Domingo, 9 de Marzo de 2008, Daniel R.
Troitiño escribió:> En la librería estándar tienes el módulo timeout:
http://ruby-doc.org/stdlib/libdoc/timeout/rdoc/index.html
Gracias 
El Domingo, 9 de Marzo de 2008, Iñaki Baz C.
escribió:
PD: Una cosilla (reconozco que aún no lo he buscado), ¿cómo podría hacer
para limitar el tiempo que se queda esperando a recibir con io.read(55)
esos 55 bytes?
Bien, bueno, la pregunta concreta es cómo finalizar desde Ruby la conexión TCP
si es que el cliente que la ha establecido no acaba de mandar el número de
bytes esperado y no se digna a cerrar él la
conexión.
Supongo que tendré que lanzar algún timer (ya buscaré cómo se hace eso) antes
de hacer el “io.read(N)” y cuando se dispare llamar al método io que
elimina
la
conexión.