Tentamen Nätverksprogrammering Lösningsförslag

Relevanta dokument
Tentamen Nätverksprogrammering Lösningsförslag

Tentamen Nätverksprogrammering Lösningsförslag

Tentamen Nätverksprogrammering Lösningsförslag

Tentamen Nätverksprogrammering Lösningsförslag

Tentamen Nätverksprogrammering Lösningsförslag

Tentamensskrivning Nätverksprogrammering (EDA095 - FED) , kl 8-13

Tentamen Nätverksprogrammering Lösningsförslag

Tentamensskrivning Nätverksprogrammering (EDA095) , kl 8-13

DI-institutionen Sid 1 av 6 Hans-Edy Mårtensson Sten Sundin

FÖRSLAG TILL LÖSNINGAR FÖR TENTAMEN I INTERNETPROGRAMMERING MED JAVA, 5p för SY , kl

Tung bakgrundsaktivitet t.ex. Aktiva objekt t.ex. Animering, simulering. DD2385 Programutvecklingsteknik Några bilder till föreläsning 9 6/5 2013

Tentamen Nätverksprogrammering Lösningsförslag

Att skriva till och läsa från terminalfönstret

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Surfning. Webbklienter och webbservrar. Specialskrivna webbservrar. Kommunikation med sockets

Javas Exceptions. DD2385 Programutvecklingsteknik Fler bilder till föreläsning 7 23/ Kort om Javas Exceptions Trådar i Java

Undantagshantering. Fördjupad Java. Fel. Undantag. Fånga Undantag. Grupper av Undantag

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Fakulteten för ekonomi, kommunikation och IT. Corba. Datum: Mathias Andersson

Undantagshantering. Fördjupad Java. Undantag. Fel. Grupper av Undantag. Fånga Undantag

Tentamen Nätverksprogrammering Lösningsförslag

Fördjupad Java. Undantagshantering. Fel

F8 Meddelandesändning med UDP

Concurrency Saker händer samtidigt. Process En instans av ett program

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

Översikt. Skriva och läsa data. Kontrollflöde. Två sorters loopar. For-loop. For-loop

Transport Layer. Transport Layer. F9 Meddelandesändning med UDP EDA095 Nätverksprogrammering. Java och UDP TCP/UDP

Parsing med Recursive Descent, Avbildningsklasser. Syntaxdiagram. Syntaxdiagram och kodning expression. Betrakta följande uttryck

F5 Meddelandesändning med TCP

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Objektorienterad Programkonstruktion. Föreläsning 11 6 dec 2016

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

10 Kommunikation i Java

Undantag. Engelska: exceptions. Skansholm: exceptionella händelser

Hämta data mha URLer Föreläsning 2b. Innehåll Klassen URL

Objektorienterad programmering i Java

DI-institutionen Sid 1 av 5 Hans-Edy Mårtensson Sten Sundin Micael Karlsson

Föreläsnings 9 - Exceptions, I/O

Föreläsning 5 Meddelandesändning med TCP

Tentamen Lösningar EDA698 Realtidssystem

OOP Objekt-orienterad programmering

Språkkonventioner och redigering av tal.

DAT043 Objektorienterad Programmering

Föreläsning 3. Stack

JAVAUTVECKLING LEKTION 7

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

Lösningar för tenta 2 DAT043,

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Tentamen ITK:P2. Inga hjälpmedel tillåtna förutom penna och papper. Skriv tydligt och texta gärna. 14 st frågor, 70 poäng.

F4. programmeringsteknik och Matlab

F2 Java I/O - strömmar Meddelandesändning med TCP

F9 Meddelandesändning med UDP

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

Föreläsning 14. Filhantering

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

Mer källkod. Styrstrukturer Val Slingor Operatorer Källkodsexempel med minne. Erik Forslin. Rum 1445, plan 4 på Nada

Vad kännetecknar en god klass. Vad kännetecknar en god klass. F12 Nested & Inner Classes

Reguljära uttryck. Reguljära uttryck. Nu kommer en siffra78 och en till SIFFRA(78) men utan 7kstuga SIFFRA(89)

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Föreläsning 11 Aktiva objekt och trådar, strömmar, kommunikation DAT043,

Innehåll. Socketar. Klient och serverprogrammering: Socketar Föreläsning 9. Klienter och servrar (som sagts tidigare ) Varför socketar

Exam Concurrent and Real-Time Programming

DAT043 Objektorienterad programmering för D, DIT011 Objektorienterad programvaruutveckling för GU

DUGGA: Objektorienterade applikationer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Föreläsning 5 Meddelandesändning med TCP

Kapitel 6. Hakparenteser fšr att ange index MŒnga všrden av samma typ

Lösningsförslag till exempeltenta 2

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

OOP Objekt-orienterad programmering

Tentamen. DD2385 Programutvecklingsteknik vt 2013 Onsdagen den 22 maj 2013 kl Hjälpmedel: penna, suddgummi, linjal

Föreläsning 3: Abstrakta datastrukturer, kö, stack, lista

Föreläsning 4. ADT Kö Kö JCF Kö implementerad med en cirkulär array Kö implementerad med en länkad lista

Tentamen, Algoritmer och datastrukturer

Avancerad SSL-programmering I

DEL 2 - Praktiska programmeringsuppgifter

Dugga Datastrukturer (DAT036)

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Lösningsförslag till tentamen för TDA540 Objektorienterad Programmering

1 Comparator & Comparable

Högskolan Dalarna sid 1 av 7 DI-institutionen Hans-Edy Mårtensson Sten Sundin Micael Karlsson

Dugga i Grundläggande programmering STS, åk

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

LÖSNINGSFÖRSLAG

Outline. Objektorienterad Programmering (TDDC77) En frukt har ett namn. Man kan lägga en frukt i en korg... Hashing. Undantag. Ahmed Rezine.

Objektorienterad Programmering (TDDC77)

Föreläsning 3-4 Innehåll

Föreläsning 3. Stack

2I1073 Lektion 2. Lektion 2a. Lektion 2a. Servlets, säkerhet, och filhantering. import java.io.*; import javax.servlet.*; import javax.servlet.http.

Denna vecka. Idag. Grafiskt användarsnitt. Vi kommer att se

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Lösningsförslag, tentamen FYTA11 Javaprogrammering

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

LÖSNINGSFÖRSLAG TILL TENTAMEN PROGRAMMERINGSMETODIK MOM2 - JAVA, 4P.

Tentamen, EDAA20/EDA501 Programmering

Laborationer, moment 4 5

Ingenjörsfirman Stéen Java Sida 1 av 1

Tentamen. 2D4135 vt 2005 Objektorienterad programmering, design och analys med Java Lördagen den 28 maj 2005 kl

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Transkript:

LUNDS TEKNISKA HÖGSKOLA 1(6) Institutionen för datavetenskap Tentamen Nätverksprogrammering Lösningsförslag 2009 06 01, 14.00 19.00 1. a) Falskt b) Sant c) Sant d) Falskt e) Falskt f) Sant g) Sant h) Falskt 2. a) En URL är ett namn på en resurs på Internet (normalt). Den består av tre huvuddelar: protocol://hostname/path/object Protokolldelen (protocol) som anger accessprotokollet till resursen. Värdmaskinnamnet (hostname) som anger på vilken maskin resursen finns. Sökväg/objektdelen (path/hostname) som anger vilken resurs på värdmaskinen som avses. Denna del kan även kompletteras med en del som anger parametrar till resursen. b) Klassen URL representerar värdmaskinen för resursen genom att slå upp dess faktiska IP-adress i en DNS-server medan klassen URI representerar värdmaskinen i textform. Det senare gör att två URIer kan betraktas som olika då de använder olika aliasnamn trots att de i verkligheten pekar ut samma resurs. 3. Marshalling innebär att data som ska skickas mellan klienten och servern vid ett RMI-anrop, dvs metodparametrar och/eller returvärden, konverteras från sin normala datarepresentation till ett externt (serialiserat) format som kan skickas över nätverket. 4. Problemet med att hantera flera olika oberoende öppna nätverksförbindelser med en enda tråd är att vi måste anropa en blockerande läsoperation för att vänta på att något ska anlända på en öppen förbindelse. Medan vi blockerar kan vi inte hantera data som kan tänkas anlända på andra förbindelser. Vi måste ha ett sätt att parallellt bevaka flera öppna förbindelser samtidigt utan att tillgripa busy-wait som pollar förbindelserna hela tiden och därmed slösar bort CPU-tid. Lösningen är klassen Selector i vilken vi kan registrera ett antal förbindelser (sockets) som vi vill kunna bevaka. När vi sedan anropar Selector.select() kommer exekveringen att blockeras tills dess något finns att göra på någon av dessa registrerade förbindelser. När vi kommer ut ur anropet kan vi ur klassen få information om på vilken förbindelse eller vilka förbindelser vi kan läsa/skriva utan att registrera att blockera.

2(6) 5. The first class of parsers is driven by events in the document, where an event here corresponds to an XML element or an HTML tag. In event-driven parsing, events are mapped onto a set of methods that will be called when they are encountered by the parser. The programmer has to create and associate a class to the parser that contains all or some of the methods and implement them so that they react properly when the parser reads the corresponding element. In the Java HTML parser, the class is ParserCallback. It features six callback methods such as handlestarttag() and handletext(). The callback is associated to the parser using the parse() method. The second class of parsers is generic and will load any XML or XHTML document in memory and build a tree out of it. The DOM implementation in Java uses node classes such as Element and Attribute (Attr) to represent elements or attributes in the document. To access, process, or transform the elements, the programmer has to traverse the tree. It can use Java DOM API methods, such as getdocumentelement(), getchildnodes(), getattributes(). Event-driven parsing is fast and economical. Tree-model parsing is versatile and generic. 6. Exempel på problem vi måste hantera för strömmande mediaapplikationer: Fördröjningar Jitter Paketförluster 7. a) 1) wait() blockerar den anropande tråden samt låser upp den aktuella monitorns lås så att andra trådar kan gå in i monitorn. Monitorn låses igen innan tråden exekverar vidare efter anropet. 2) notify() gör att en tråd som väntar i ett anrop av wait() i den aktuella monitorn, om någon sådan tråd finnes, görs körbar och lämnar anropet av wait() så fort som monitorn inte längre är låst. 3) notifyall() som notify(), fast den gör alla väntande trådar körbara. b) För att någon de nämnda metoderna ska kunna anropas måste exekveringen befinna sig inne i en metod som är deklarerad synchronized i objektet som vi anropar metoden på (eller i ett motsvarande synchronied-block). 8. a) Man måste ansluta socketen till den aktuella multicastadressen. Det gör man lämpligen med ett anrop ms.joingroup(ia);ömedelbart före while-satsen. Att multicastadressen sattes i datagramobjektet räcker inte det behöver man inte göra. b) Problemet är att när ett meddelande tas emot sätts den interna längden på datagrampaketet till längden på det mottagna meddelandet. Nästa gång samma datagramobjekt används för att ta emot ett meddelande trunkerar den meddelandet om det är längre än den tidigare längden. Lösningen är antingen att återställa längden på datagrampaketet innan nästa anrop av ms.receive(dp); genom att skriva dp.setlength(buf.length);, eller att skapa nya datagramobjekt för varje meddelande som tas emot.

3(6) 1. Filöverföring Ett vanligt problem med denna uppgift är att designa sitt applikationsprotokoll på ett sådant sätt att mottagaren av data kan avgöra när ett helt kommando eller en hel fil tagits emot över en TCPförbindelse. När man skriver en följd av strängar/bytes till en socket bildas en kontinuerlig ström av bytes. Det finns inget automatiskt sätt för mottagaren att återskapa de fragment som skrevs till strömmen i andra änden. Applikationen måste själv avgöra var de olika delfälten börjar och slutar. Man kan t.ex. inte avgöra när en sträng har överförts genom att läsa tills metoden read() returnerar -1! Detta betyder att strömmen är stängd och att inget mera kan skickas på den någonsin och det är ju inte vad vi är ute efter! Man kan tänka sig åtminstone två olika alternativa lösningar på uppgiften. Den ena håller en TCP-förbindelse öppen under hela sessionen med användaren. Filnamn som överförs över TCPförbindelsen avslutas alltid med ett särskilt tecken med koden 0 för att mottagaren ska kunna detektera detta. Filer kan ju innehålla vilka tecken som helst så där fungerar inte den tekniken. I stället skickas först längden på filen i bytes innan själva innehållet skickas. Då vet mottagaren exakt hur många tecken som ska komma. Lösning nummer två, som redovisas nedan, bygger istället på att en helt ny TCP-uppkoppling sker för varje kommando. När en fil överförts helt stänger sändaren helt enkelt uppkopplingen och filslut kan i detta fall detekteras genom att read() returnerar -1. import java.io.*; import java.net.*; public class FileClient { public static void main(string args[]) { if (args.length!=1) { System.err.println("Syntax: java FileClient <target machine>"); else { BufferedReader input = new BufferedReader( new InputStreamReader(System.in)); String command; do { System.out.println("Ready!"); command = input.readline(); if (command.charat(0)== s ) { sendfile(args[0],command.substring(2, command.length())); if (command.charat(0)== g ) { getfile(args[0],command.substring(2, command.length())); while (!command.equals("q")); catch (IOException e) { System.err.println("An I/O error occurred."); private static void sendfile(string target,string name) throws IOException { FileInputStream f = new FileInputStream(name); Socket sock = new Socket(target,3788); OutputStream os = sock.getoutputstream(); os.write( s ); os.write(name.getbytes()); os.write(0); int ch = f.read();

4(6) os.write(ch); ch = f.read(); sock.close(); private static void getfile(string target,string name) throws IOException { FileOutputStream f = new FileOutputStream(name); Socket sock = new Socket(target,3788); InputStream is = sock.getinputstream(); OutputStream os = sock.getoutputstream(); os.write( g ); os.write(name.getbytes()); os.write(0); os.flush(); int ch = is.read(); f.write(ch); ch = is.read(); sock.close(); ---------------- import java.io.*; import java.net.*; class RequestHandler extends Thread { private Socket sock; public RequestHandler(Socket s) { sock = s; public void run() { InputStream is = null; OutputStream os = null; int command; is = sock.getinputstream(); os = sock.getoutputstream(); command = is.read(); switch (command) { case g : transferfile(is,os); break; case s : receivefile(is); break; sock.close(); catch(ioexception e { sock.close(); catch(ioexception e) {

5(6) private void transferfile(inputstream is,outputstream os) throws IOException { String filename = readfile(is); FileInputStream f = new FileInputStream(filename); int ch = f.read(); os.write(ch); ch = f.read(); private void receivefile(inputstream is) throws IOException { String filename = readfile(is); FileOutputStream f = new FileOutputStream(filename); int ch = is.read(); f.write(ch); ch = is.read(); private String readfile(inputstream is) throws IOException { String name = new String(); int ch = is.read(); while (ch>0) { name = name+((char) ch); ch = is.read(); return name; class FileServer { public static void main(string args[]) { ServerSocket server = null; Socket sock = null; server = new ServerSocket(3788); while (true) { sock = server.accept(); new RequestHandler(sock).start(); catch(ioexception e) { System.err.println("An error occurred, terminating..."); System.exit(1);

6(6) 2. Tricket här var att genomskåda att detta inte handlar om något annat än en enkel buffer, eller mailbox, liksom den som implementerades i laboration 2. Vi godkände lösningar med buffertlängden ett (som på laborationen) såväl som lösningar som kunde buffra fler socket-objekt. Nedan visas en enkel lösning med buffertlängden ett. Att göra en variant av bufferten som klarar att buffra mer än en begäran är nästan ännu enklare än lösningen nedan om vi förutsätter att vi inte kommer att köra slut på minnet. Då ersätter vi bara attributet request med en lista av något slag och assignjob() kommer då aldrig att behöva vänta. Den lägger bara in parametern sist i listan och gör notify(). Den andra metoden awaitjob() kommer då att vänta tills listan är icke-tom samt då plocka ut det äldsta elementet. Den behöver då inte längre heller göra notifyall(). public class ThreadPoolManager { private Socket request = null; public synchronized void assignjob(socket s) { while (request!=null) { wait(); catch(interruptedexception e) { // Should not happen e.printstacktrace(); System.exit(1); request = s; notify(); // notifall() also OK, but not necessary. public synchronized Socket awaitjob() { while (request==null) { wait(); catch(interruptedexception e) { // Should not happen e.printstacktrace(); System.exit(1); Socket s = request; request = null; notifyall(); // notifall() necessary in this case. return s;