Examen Final Tardor 2013 (2014)

Examen Catalán
Universidad Universidad Politécnica de Cataluña (UPC)
Grado Ingeniería de Sistemas de Telecomunicación - 2º curso
Asignatura Aplicacions i Serveis Telematics
Año del apunte 2014
Páginas 8
Fecha de subida 08/04/2015
Descargas 3
Subido por

Vista previa del texto

ESCOLA TÈCNICA SUPERIOR D’ENGINYERIA DE TELECOMUNICACIÓ DEPARTAMENT D’ENGINYERIA TELEMÀTICA APLICACIONS I SERVEIS TELEMÀTICS Examen Final. Tardor 2013 Notes Prov.: Dilluns 27 Gener. Revisió Presencial: 28 Gener a les 10:30h al lab AST.
1) Es vol programar un mètode readLine(long msecs) que llegeix una línia de caràcters acabada en '\n' d'un Reader durant un temps de temporització msecs milisegons. Si expira la temporització abans de llegir la línia, llença l'excepció TimeoutException que es suposa implementada.
a.- Suposant implementada la classe TimedBufferedReader, que hereta de BufferedReader i afegeix el mètode readLine amb temporització comentat, programeu una aplicació simple que llegeixi una línia del teclat durant 10 secs i la imprimeixi per pantalla. Si el readLine temporitza (expiren els 10 secs), l'aplicació imprimeix per pantalla: "readLine timed out".
b.- ReaderThr és una classe auxiliar que llegeix una línia del teclat i la deixa a TimedBufferedReader usant el mètode writeLine(String str). Implementeu-la completant la plantilla següent: class ReaderThr extends Thread { ...
ReaderThr(TimedBufferedReader tr) { ...
} public void run() { ...
} } NOTA: No tingueu en compte la finalització de ReaderThr (és a dir, podem suposar que queda bloquejat esperant una entrada per teclat, que es pot produir o no, i que acaba automàticament quan el thread d'aplicació acaba).
c.- Implementeu la classe TimedBufferedReader, que és un monitor natiu de Java amb alguns mètodes executant-se en exclusió mútua. Una aplicació que utilitzi TimedBufferedReader (per exemple la de l'apartat a.- ) invocarà el mètode readLine(long msecs).
La classe TimedBufferedReader s'ha de programar completant la plantilla següent: class TimedBufferedReader extends BufferedReader { ...
TimedBufferedReader(Reader r) { ...
} /* invoked by Aplicació */ ... String readLine(long tout) ... { ...
// create and start auxiliary thread ReaderThr ...
} /* invoked by ReaderThr */ ... void writeLine(String str) { ...
} } Per programar la temporització a readLine(long msecs) feu servir la crida wait amb temporització (wait(msecs)).
2) Suposem ara que la temporització no es fa a readLine(long msecs) sinó que es delega a un altre thread auxiliar Timer. Ara la clase TimedBufferedReader implementa la següent interfície: interface Timeable { void timeout(); } i la plantilla de TimedBufferedReader queda com: class TimedBufferedReader extends BufferedReader implements Timeable { ...
TimedBufferedReader(Reader r) { ...
} /* invoked by Aplicació */ ... String readLine(long tout) ... { ...
// create and start auxiliary thread ReaderThr ...
} /* invoked by ReaderThr */ ... void writeLine(String str) { ...
} /* invoked by Timer */ ... public void timeout() { ...
} } a.- completeu la classe TimedBufferedReader fent servir Timer que obeeix a la següent plantilla: class Timer extends Thread { ...
Timer(long tout, Timeable t) { ...
} ... void run() { ...
} } b.- completeu la classe Timer.
NOTA: No tingueu en compte la finalització de ReaderThr i Timer. Suposeu que acaben automàticament quan el thread d'aplicació acaba.
3) Es demana el Servidor multithreading d'una variant del problema d'eco amb pas de missatges. Ara el servidor llegeix la línia del client i l'envia invertida caràcter a caràcter al client. Per exemple: Hola que tal? ?lat euq aloH 123456 654321 a.- Programeu un mètode String readInvertedLine(Reader r): llegeix una línia caràcter a caràcter de r i retorna l'String invertit. Retorna null si EOF. De Reader, tan sols es podrà fer servir el mètode int read(), que retorna el caràcter llegit, -1 si EOF.
b.- Programeu el servidor multithreading usant readInvertedLine.
NOTA: totes les classes que s'usin s'hauran d'implementar excepte: wrappers MySocket/MyServerSocket, containers usats o classes del runtime de Java com per exemple mètodes de la classe String 4) Preguntes teòriques de protocols: a.- Suposem un canal on hi poden haver errors, però no pèrdues. Dibuixar la màquina d'estats finits d'un protocol fiable per aquest canal.
b.- Comentar breument el control de flux del protocol TCP.
1.a) import java.io.*; class TimeoutException extends Exception { } public static void main(String[] args) { TimedBufferedReader tr = new TimedBufferedReader(new InputStreamReader(System.in)); String line = null; try { line = tr.readLine(10000); // 10secs System.out.println("line is: " + line); } catch (TimeoutException e) { System.out.println("readLine timed out"); } } b) class ReaderThr extends Thread { TimedBufferedReader tr; ReaderThr(TimedBufferedReader tr) { this.tr = tr; } public void run() { String line = null; try { line = tr.readLine(); } catch (IOException e) { } tr.writeLine(line); } } c) class TimedBufferedReader extends BufferedReader { String line; boolean empty; TimedBufferedReader(Reader r) { super(r); empty = true; } synchronized String readLine(long tout) throws TimeoutException { new ReaderThr(this).start(); try { wait(tout); } catch (InterruptedException e) { } if (empty) throw new TimeoutException(); empty = true; return line; } synchronized void writeLine(String str) { empty = false; line = str; notify(); } } 2.a) class TimedBufferedReader extends BufferedReader implements Timeable { boolean empty = true; String line; Timer tid; TimedBufferedReader(Reader r) { super(r); empty = true; } synchronized String readLine(long tout) throws TimeoutException { new ReaderThr(this).start(); new Timer(tout, this); try { wait(); } catch (InterruptedException e) { } if (empty) throw new TimeoutException(); empty = true; return line; } synchronized void writeLine(String str) { empty = false; line = str; notify(); } synchronized public void timeout(Timer tid) { notify(); } } b) class Timer extends Thread { long tout; Timeable t; Timer(long tout, Timeable t) { this.tout = tout; this.t = t; start(); } public synchronized void run() { try { wait(tout); } catch (InterruptedException e) { } t.timeout(); } } 3.public class EchoLineInvertedServer { // a) static private String readInvertedLine(Reader r) { int ch = 0; /** * we make use of an unlimited stack of ints, * interpreted as chars * pop returns -1 when end of stack */ Stack st = new Stack(); String str = ""; try { if ((ch = r.read()) == -1) return null; while (ch != '\n') { st.push(ch); ch = r.read(); } } catch (IOException ex) { ex.printStackTrace(); } while ((ch = st.pop()) != -1) str += (char)ch; return str; } // b) public static void main(String[] args) { MyServerSocket ss = new MyServerSocket(Integer.parseInt(args[0])); while (true) { MySocket s = ss.accept(); new Thread() { MySocket s; public void run() { String line; while ((line = readInvertedLine(s.getReader())) != null) s.println(line); s.close(); } public void start(MySocket s) { this.s = s; start(); } }.start(s); } } } 4.a) Emissor Receptor b) El control de flux s'utilitza per no saturar al receptor. El receptor disposa d'un buffer, i s'ha d'adaptar la velocitat de transmissió de l'emissor per tal de no saturar aquest buffer. El receptor comunica a l’emissor l'espai lliure del buffer, utilitzant un camp específic en la capçalera del segment TCP. Aquest valor l'emissor l'utilitza com a grandària d'una finestra lliscant.
...