You are on page 1of 5

TSR: Ejercicios Seminario 1

EJERCICIO 1
ENUNCIADO: Se quiere implementar un servidor net que reciba peticiones de cmputo de las
funciones matemticas factorial y fibonacci.

Se considera que se dispone de un mdulo Node, llamado myFunctions.js, con la siguiente


implementacin de las funciones.

1 function fibo(n) { return (n<2) ? 1 : fibo(n-2) + fibo(n-1) }


2 function fact(n) { return (n<2) ? 1 : n * fact(n-1) }
3 exports.fibo = fibo
4 exports.fact = fact

Se dispone, adems, de la siguiente implementacin parcial del servidor net:

1 var net = require('net');


2 var fun = require('./myFunctions');
3
4 var end_listener = function() {console.log('server disconnected');}
5 var error_listener = function() {console.log('some connection error');}
6 var bound_listener = function() {console.log('server bound');}
7
8 var server = net.createServer(
9 // A COMPLETAR
10 });
11
12 server.listen(9000, bound_listener);

Se pide completar la implementacin del servidor net, teniendo en cuenta las siguientes
especificaciones:

- Cada cliente net que se conecte al servidor enviar una peticin de cmputo de la
funcin fact (factorial) o la funcin fibo (fibonacci). Dicha peticin ser un objeto
serializado con JSON. El objeto contendr dos propiedades: una propiedad llamada
func, cuyo valor ser fact o fibo segn la funcin que se desee calcular; y otra
propiedad llamada numb, cuyo valor ser el argumento de entrada para la funcin a
calcular.

- El servidor net calcular el valor de la funcin solicitada para el argumento indicado, y


responder al cliente con un mensaje que incluya el nombre de la funcin, el valor del
argumento, y el resultado. Ejemplos, fibo(7)=21, fact(4)=24.

TSR: Actividades Seminario 1 Pgina 1


- El servidor net responder al cliente con resultado NaN si, en la peticin recibida, la
propiedad func tiene un valor distinto de fibo y de fact, o si la propiedad numb no
tiene un valor numrico vlido. Ejemplos, gamba(9)=NaN, fibo(sepia)=NaN.

- En respuesta al evento end, deber ejecutarse la funcin end_listener. En respuesta


al evento error, deber ejecutarse la funcin error_listener.

EJERCICIO 2
ENUNCIADO: Se quiere implementar un cliente net que enve peticiones de cmputo de las
funciones matemticas factorial y fibonacci al servidor del anterior ejercicio.

Se dispone de la siguiente implementacin parcial del cliente net:

1 var net = require('net');


2
3 // A COMPLETAR
4
5 // The server is in our same machine.
6 var client = net.connect( {port: 9000}, function() { // 'connect' listener
7 // A COMPLETAR
8 });
9
10 // A COMPLETAR

Se pide completar la implementacin del cliente net, teniendo en cuenta las siguientes
especificaciones:

- El cliente debe ser invocado proporcionndole dos argumentos: el identificador de la


funcin a calcular y el valor de entrada para dicha funcin. As, una llamada vlida
sera: node cliente fibo 32. Y una llamada incorrecta sera: node cliente fact.
En el caso de que el programa se invoque con un nmero de argumentos incorrecto,
se debe mostrar un mensaje informativo sobre su uso correcto y terminar la ejecucin.

- El cliente deber construir un objeto con dos propiedades, func y numb, cuyos valores
sern los recibidos como argumentos en la invocacin del programa. Dicho objeto,
serializado con JSON, ser el contenido del nico mensaje que el cliente enviar al
servidor.

- Al recibir la respuesta del servidor, el cliente la mostrar en la salida estndar (consola)


y terminar su ejecucin.

- Si se genera el evento end, el cliente debe mostrar en consola el mensaje 'client


disconnected'.

TSR: Actividades Seminario 1 Pgina 2


Ayuda: Informacin de API de Node.js

net.createServer([options][, connectionListener])
Creates a new server. The connectionListener argument is automatically set as a listener for the
'connection' event.

net.Socket
This object is an abstraction of a TCP or local socket. net.Socket instances implement a duplex
Stream interface. They can be created by the user and used as a client (with connect()) or they
can be created by Node.js and passed to the user through the 'connection' event of a server.

Event: 'data'
Emitted when data is received. The argument data will be a Buffer or String. Encoding of data is
set by socket.setEncoding(). Note that the data will be lost if there is no listener when a Socket
emits a 'data' event.

Event: 'end'
Emitted when the other end of the socket sends a FIN packet.

Event: 'error'
Emitted when an error occurs. The 'close' event will be called directly following this event.

socket.write(data[, encoding][, callback])


Sends data on the socket. The second parameter specifies the encoding in the case of a string--
it defaults to UTF8 encoding.
Returns true if the entire data was flushed successfully to the kernel buffer. Returns false if all
or part of the data was queued in user memory.
The optional callback parameter will be executed when the data is finally written out - this may
not be immediately.

TSR: Actividades Seminario 1 Pgina 3


Solucin Ejercicio 1

Una solucin que satisface los requisitos del enunciado es la siguiente:

1 var net = require('net');


2 var fun = require('./myFunctions');
3
4 var end_listener = function() {console.log('server disconnected');}
5 var error_listener = function() {console.log('some connection error');}
6 var bound_listener = function() {console.log('server bound');}
7
8 var server = net.createServer(
9 function(c) { // 'connection' listener
10 console.log('server connected');
11 c.on('end', end_listener);
12 c.on('error', error_listener);
13 c.on('data', function(data){
14 var obj = JSON.parse(data);
15 var res;
16 if ( typeof(obj.numb) != 'number' ) {
17 res = NaN;
18 }
19 else { switch (obj.func) {
20 case 'fibo': res = fun.fibo(obj.numb); break;
21 case 'fact': res = fun.fact(obj.numb); break;
22 default: res = NaN;
23 }}
24 c.write( obj.func+'('+obj.numb+') = '+res );
25 });
26 });
27
28 server.listen(9000, bound_listener);

TSR: Actividades Seminario 1 Pgina 4


Solucin Ejercicio 2

Una solucin que satisface los requisitos del enunciado es la siguiente:

1 var net = require('net');


2
3 if ( process.argv.length != 4 ) {
4 console.log('uso: node client_net function_id number_value');
5 process.exit(0);
6 }
7
8 var func = process.argv[2];
9 var numb = Math.abs(parseInt(process.argv[3]));
10
11 // The server is in our same machine.
12 var client = net.connect( {port: 9000}, function() { //'connect' listener
13 console.log('client connected');
14 request = {"func":func, "numb":numb};
15 client.write( JSON.stringify(request) );
16 });
17
18 client.on('data', function(data) {
19 console.log(data.toString());
20 client.end();
21 });
22
23 client.on('end', function() {
24 console.log('client disconnected');
25 });

TSR: Actividades Seminario 1 Pgina 5

You might also like