• Publicidad

Servidor Cliente

Así que programas sin strict y las expresiones regulares son otro modo de hablar. Aquí encontrarás respuestas de nivel avanzado, no recomendable para los débiles de corazón.

Servidor Cliente

Notapor explorer39 » 2005-08-29 11:01 @500

Necesito ayuda.
Tengo que hacer un servidor TCP que quede escuchando en un determinado puerto.
Cuando un cliente se conecte, debo leer un fichero XML, comprimirlo en zip y enviarlo con una cabecera inicial de 4 bytes 0.
Esta es la parte sencilla que ya tengo resuelta. Lo complicado viene ahora:
De resultas de enviar el mensaje, debo quedar a la espera de la respuesta del cliente.
Si el cliente me manda 4 bytes 0 entonces significa que lo ha recibido bien y que puedo enviarle el siguiente o esperar a tener que enviarle un nuevo fichero, cuando exista.
Pero si la cabecera es un 1 o un 2 (entero de 4 bytes) entonces tengo que reenviarle el mensaje.
Y así seguir hasta que el cliente corte la conexión.
¿Alguien tiene algún ejemplo de un servidor con un diálogo parecido?
explorer39
 

Publicidad

Re: Servidor Cliente

Notapor Perl user » 2005-08-29 12:45 @573

explorer39 escribiste:Necesito ayuda.
Tengo que hacer un servidor TCP que quede escuchando en un determinado puerto.

Puedes usar Socket, IO::Socket ( no es TAN recomendado en lo personal, no es necesaria una abstracción OO para este tipo de funcionalidades ) o POE::Component::Server::TCP ( lo que más recomiendo ).
explorer39 escribiste:Cuando un cliente se conecte, debo leer un fichero XML, comprimirlo en zip y enviarlo con una cabecera inicial de 4 bytes 0.
Esta es la parte sencilla que ya tengo resuelta.

Si bueno, en general como harás una lectura a disco (supongo) la E/S siempre es costosa, y cuando manejas aplicaciones Cliente-Servidor siempre se recomienda alguna técnica de concurrencia: Forking, Threading, Select polls ( que en este punto es donde recomiendo POE ),
preforking, prethreading.
Cada una de las anteriores tiene sus pros/contras y la implementación de algunas es mas sencilla.
explorer39 escribiste:Lo complicado viene ahora:
De resultas de enviar el mensaje, debo quedar a la espera de la respuesta del cliente.
Si el cliente me manda 4 bytes 0 entonces significa que lo ha recibido bien y que puedo enviarle el siguiente o esperar a tener que enviarle un nuevo fichero, cuando exista.
Pero si la cabecera es un 1 o un 2 (entero de 4 bytes) entonces tengo que reenviarle el mensaje.
Y así seguir hasta que el cliente corte la conexión.
¿Alguien tiene algún ejemplo de un servidor con un diálogo parecido?

Uhm... Si entendí bien, el cliente leerá de 0 a 4 bytes del servidor, si el total de bytes leídos son 4 entonces implica que el contenido se ha leído correctamente y comenzará a descargar todo el XML, sino, entonces se debe volver a mandar el header?
Si es así, entonces, basta conque el servidor despache cada cliente, envíandole dicho header, y el programa cliente deberá verificar que 'bytes_read' es igual a 4, sino, volver a hacer la petición.
Los bytes los puedes empacar con pack claro.
Así es como entendí el problema.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924

Re: Servidor Cliente

Notapor explorer39 » 2005-08-29 13:56 @622

Perl user escribiste:Puedes usar Socket, IO::Socket ( no es TAN recomendado en lo personal, no es necesaria una abstracción OO para este tipo de funcionalidades ) o POE::Component::Server::TCP ( lo que más recomiendo ).
Hace tiempo que miraba ese componente, pero los ejemplos que hay no me aclaran nada.
Perl user escribiste:
explorer39 escribiste:Cuando un cliente se conecte, debo leer un fichero XML, comprimirlo en zip y enviarlo con una cabecera inicial de 4 bytes 0.
Esta es la parte sencilla que ya tengo resuelta.

Si bueno, en general como harás una lectura a disco (supongo) la E/S siempre es costosa, y cuando manejas aplicaciones Cliente-Servidor siempre se recomienda alguna técnica de concurrencia: Forking, Threading, Select polls ( que en este punto es donde recomiendo POE ),
preforking, prethreading.
Cada una de las anteriores tiene sus pros/contras y la implementación de algunas es mas sencilla.
No es costosa en este caso, porque los ficheros xml a leer son de menos de 200 bytes.
Perl user escribiste:Uhm... Si entendí bien, el cliente leerá de 0 a 4 bytes del servidor, si el total de bytes leídos son 4 entonces implica que el contenido se ha leído correctamente y comenzará a descargar todo el XML, sino, entonces se debe volver a mandar el header?
No... voy a intentar explicarlo bien.
* El servidor queda esperando en un puerto.
* Un cliente se conecta.
* El servidor lee de un directorio los ficheros XML que tiene que enviar. Escoje el más viejo. Lo empaqueta en zip. Le agrega una cabecera de 4 bytes 0 al principio, y lo manda al cliente (todo).
* El servidor queda a la espera de la respuesta.
* El cliente debe recibir el envío, descomprimir el zip y verificar que todo está bien (xml y zip).
* Si todo está bien, responde con 4 bytes 0 al servidor.
* Si algo anda mal, responde con 4 bytes, siendo el último de ellos un 1 o un 2 dependiendo del tipo de fallo.
* El cliente queda otra vez a la escucha.
* El servidor, al recibir la respuesta de 4 bytes 0, debe descartar el XML que envió, pues se envió bien.
* Si en cambio se reciben 4 bytes que no son 0, entonces debe repetir el proceso de búsqueda y envío.
* El bucle de envío de ficheros se debe hacer hasta que no haya más. En ese momento, si el cliente sigue conectado, nos quedamos a la espera de tener más xml que mandar.

Me suena que la solución puede ser muy sencilla, pero lo que necesitaba es un ejemplo de un servidor que sea capaz tanto de enviar como de recibir información del cliente.

Gracias!
explorer39
 

Re: Servidor Cliente

Notapor Perl user » 2005-08-29 15:48 @700

explorer39 escribiste:Hace tiempo que miraba ese componente, pero los ejemplos que hay no me aclaran nada.

Uhm... bueno, entender el funcionamiento general de POE no es algo trivial, pero una vez que lo haces, puedes crear aplicaciones multitareas de una manera natural, sencilla y limpia.
POE es un framework para generar aplicaciones concurrentes y multitareas, puedes verlo como un pequeño sistema operativo en Perl, tiene un Kernel, el cual es un despachador de eventos, timers, etc etc etc, tiene Filtros, Engranes, Componentes, todo lo necesario para ensamblar tus aplicaciones. Los Componentes son los elementos de mas alto nivel, generalmente los que los usuarios comparten con alguna funcionalidad específica ( en este caso Server::TCP y Client::TCP ).
Es necario visitar la página del proyecto POE para revisar la documentación necesaria y sobre todo es recomendado checar el cookbook con ejemplos funcionales.
explorer39 escribiste:No es costosa en este caso, porque los ficheros xml a leer son de menos de 200 bytes.

Bueno es costoso no por la cantidad de bytes a leer, sino porque normalmente las funciones de I/O a bajo nivel son COSTOSAS en cuanto a las llamadas al sistema ( aun se utilice stdio ), rendimiento, etc.
Normalmente en aplicaciones de red, comenté que es necesario para evitar el estancamiento, utilizar forks o threads o alguna técnica que permita que una vez que se establece una conexión, sea otro ente en ejecución quien atienda a dicho cliente, así el servidor quedará libre para otra petición. Si las peticiones del cliente hacia el servidor son esporádicas, entonces no es necesario lo anterior.
explorer39 escribiste:No... voy a intentar explicarlo bien.
* El servidor queda esperando en un puerto.
* Un cliente se conecta.
* El servidor lee de un directorio los ficheros XML que tiene que enviar. Escoje el más viejo. Lo empaqueta en zip. Le agrega una cabecera de 4 bytes 0 al principio, y lo manda al cliente (todo).
* El servidor queda a la espera de la respuesta.
* El cliente debe recibir el envío, descomprimir el zip y verificar que todo está bien (xml y zip).
* Si todo está bien, responde con 4 bytes 0 al servidor.
* Si algo anda mal, responde con 4 bytes, siendo el último de ellos un 1 o un 2 dependiendo del tipo de fallo.
* El cliente queda otra vez a la escucha.
* El servidor, al recibir la respuesta de 4 bytes 0, debe descartar el XML que envió, pues se envió bien.
* Si en cambio se reciben 4 bytes que no son 0, entonces debe repetir el proceso de búsqueda y envío.
* El bucle de envío de ficheros se debe hacer hasta que no haya más. En ese momento, si el cliente sigue conectado, nos quedamos a la espera de tener más xml que mandar.

Me suena que la solución puede ser muy sencilla, pero lo que necesitaba es un ejemplo de un servidor que sea capaz tanto de enviar como de recibir información del cliente.

Gracias!

Okas ya entendí tu caso, pero sería bueno que mejor mostraras lo que llevas hecho para poder ayudarte, no tengo yo alguna aplicación a la mano que pueda mostrarte o ejemplo completo con tu caso, pero el ejemplo es el clásico Espera-Conecta-Atiende(fork)-Espera. Si POE no te viene al inicio, entonces intenta hacerlo primero con el módulo Socket directamente.

Saludos,
Marco A. Manzo
[email protected]
http://www.unixmonkeys.com/amnesiac/
Perl Programming Language
Perl user
Maestro honorario
Maestro honorario
 
Mensajes: 271
Registrado: 2004-11-03 21:11 @924


Volver a Avanzado

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados