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

Tentamen Nätverksprogrammering Lösningsförslag

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

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

Tentamen Nätverksprogrammering Lösningsförslag

Tentamen Nätverksprogrammering Lösningsförslag

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

Lösningar för tenta 2 DAT043,

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

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

Input. Programmering. Andra källor

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

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

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

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

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

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

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

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

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

Tentamen Programmeringsteknik II för STS Skrivtid: Inga hjälpmedel.

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

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.

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

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

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

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

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

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

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

Språkkonventioner och redigering av tal.

TENTAMEN OOP

DAT043 Objektorienterad Programmering

EDA095 HTML. Per Andersson. April 26, Lund University Innehåll: HTML, CSS, DOM, JavaScript

Föreläsning 14. Filhantering

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

Kort repetition. Programmeringsteknik för Bio1 och I1. Vad ska vi lära oss idag? Ett exempel

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

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

Föreläsning 7. Träd och binära sökträd

Programmering för språkteknologer II, HT2011. Rum

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

Tentamen OOP

Tentamen , Introduktion till Java, dtaa98, dtea53

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

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Lösningsförslag till exempeltenta 2

Tentamen, EDAA10 Programmering i Java

Fördjupad Java. Undantagshantering. Fel

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

TENTAMEN OOP

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad Programmering (TDDC77)

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

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

Föreläsning 3-4 Innehåll

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

Objektorienterad Programkonstruktion. Föreläsning jan 2016

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

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

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

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

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

Tentamen för TDA540 Objektorienterad Programmering. Institutionen för Datavetenskap CTH HT-17, TDA540. Dag: , Tid:

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Lite mer om Javas stöd för fält. Programmering. Exempel: vad är det största talet? hh.se/db2004. Fält samt Input/Output

Föreläsning 5-6 Innehåll

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

Tentamen. Lösningsförslag

public boolean containskey(string key) { return search(key, head)!= null; }

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

1 Uppgift 1. a) Skapar ett Company-objekt med hjälp av den överlagrade konstruktorn. Du kan själv välja värden på instansvariablerna.

Generiska konstruktioner. Kursbokens kapitel 13

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

Lösningsförslag till tentamen i EDA011/EDA017 Programmeringsteknik för F, E, I, π och N 25 maj 2009

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

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

Vem är vem på kursen. Objektorienterad programvaruutveckling GU (DIT011) Kursbok Cay Horstmann: Big Java 3rd edition.

Tentamen, Algoritmer och datastrukturer

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

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

EDAA20 Föreläsning Klassen ArrayList. Viktiga operationer på ArrayList. Generisk klass

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Typkonvertering. Java versus C

Föreläsning 8 - del 1: Objektorienterad programmering (forts.) - Exempel

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

Lösningsförslag tentamen FYTA11 Java

LÖSNINGSFÖRSLAG

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

Services + REST och OAuth

public och private Obs: private inte skyddar mot access från andra objekt i samma klass.

Tentamen, EDAA20/EDA501 Programmering

Transkript:

LUNDS TEKNISKA HÖGSKOLA 1(6) Institutionen för datavetenskap Tentamen Nätverksprogrammering Lösningsförslag 2011 06 03, 14.00 19.00 Del 1 1. REST-ramverk använder HTTP metoder för att interagera med en server i en databasliknande kontext. Målet är att implementera CRUD- (create, retrieve, update, delete) kommandon med HTTP. En allmän mappning är Create: POST, Read (Retrieve): GET, Update: PUT och Delete: DELETE. Doodle har en API som tillåter att: 1. skapa ett möte med POST 2. hämta ett mötes data med GET 3. ändra ett mötes egenskaper med PUT 4. ta bort ett möte med DELETE 2. En XML/DOM-parser är en parser som bygger ett syntaxträd från ett XML dokument. DOM definierar standardiserade objek typer och ett Java-gränsnitt (API) för att axessa parse-trädet. DOMmodellen innehåller till exempel typen Document för att representera ett träd, Node för att representera en nod och Element för att representeratt XML-element. JAVA API:n innehåller klasser och metoder för att från ett XML dokument bygga ett träd av XML/DOM-objekt. JAVA API:n innehåller metoder för att traversera träd, för att manipulera noder, för att infoga noder och för att ta bort noder. 3. XSL/XSLT är ett XML-språk för att applicera transformationer på XML-dokument, till exempel för att transformera innehållet i en XML-databas till en XHTML presentation. XSL/XSLT är ett template-språk var ett program traverserar XML-trädet motsvarande dokumentet givet som indata. Man använder XSL/XSLT genom att skriva regler som matchar en nod (<xsl:template match...>) i källdokument och som producerar en transformation från noden, till exempel till XHTML utdata. XSL/XSLT är ett komplett språk som innehåller loops, conditions, etc. 4. 1. Falskt (en dator kan mycket väl ha både en IPv4-adress och en IPv6-adress och paket av båda typerna kan skickas på samma nätverk) 2. Falskt (TCP och UDP är snarare exempel på transportprotokoll) 3. Sant 4. Falskt (multicast är datagrambaserat och håller inte några fasta uppkopplingar öppna) 5. Sant 6. Sant 5. 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.

2(6) 6. a) I operationen pause har Ida använt sig av en teknik kallad busy-wait för att vänta på att attributet paused ska få värdet false. Det innebär att programmet kommer att använda all tillgänglig CPU-kraft till att köra while-loopen i stället för att, som var avsikten, överlåta CPU-tiden åt andra trådar. b) public class PauseControl { private boolean paused = false; public synchronized void setpause(boolean state) { paused = state; notifyall(); public synchronized void pause() { while(paused) { wait(); catch(interruptedexception e { System.exit(1); 7. a) Javascript b) CGI c) JSP d) PHP e) AJAX f) Servlets 8. a) Programmet läser till slutet på strömmen snarare än till nästa radslut. Slutet på strömmen kommer när strömmen stängs i detta fall när Telnet-klienten kopplar ner och det är ju uppenbart inte vad vi var ute efter. Slutet på strömmen upptäcker man genom att read() returnerar -1. b) Innan vi skriver den modifierade koden behöver vi bestämma oss för hur vi upptäcka och hantera radslut. Olika operativsystem och program markerar radslut på olika sätt. I Unix används t.ex. normalt tecknet linefeed med teckenkoden 10. I Windows och i programmet Telnet oavsett operativsystem används en sekvens av två tecken: carriage return (teckenkod 13) följt av linefeed (teckenkod 10). Om vi väljer den senare konventionen får vi också bestämma oss för hur vi vill göra ifall vi får in teckensekvenser som inte följer standarden, t.ex. ett ensamt carriage return eller linefeed. I programkoden nedan har vi bestämt oss för att rader antas avslutas med ett linefeed och eventuella carriage return ignoreras. På så sätt klara vi radslut à la Unix såväl som Windows/Telnet. public String readline(inputstream is) throws IOException { String result = new String(); int ch = is.read(); while (ch!=-1 && ch!=10) { if (result!=13) { result = result + (char) ch; ch = is.read(); return result; En variant på lösningen är att i stället kapsla in strömmen i en DataInputStream och ersätta inläsningen med ett anrop av readline().

3(6) Del 2 DownloadHelper 1. a) Den färdiga HTML-parsern i Java utgörs av den abstrakta inre klassen HTMLEditorKit.Parser vilket gör att ett parserobjekt inte kan skapas på normalt sätt. Det måste göras genom ett anrop av metoden getparser() i HTMLEditorKit.Parser. Det som ytterligare försvårar saken är att getparser() är deklarerad protected vilket gör att vi måste skapa en ny subklass till HTMLEditorKit.Parser med en metod deklarerad public som i sin tur anropar getparser() åt oss. Se koden nedan. För att erhålla ett parserobjekt skapar vi en instans av den nya klassen och anropar den publika metoden. Onödigt krångligt kan tyckas. Se boken sid 248 samt föreläsningsbilderna från föreläsningen om URL och HTML. public class ParserGetter extends HTMLEditorKit { public HTMLEditorKit.Parser getparser() { return super.getparser(); b) Se sidan 248 och framåt i boken samt föreläsningsbilderna från föreläsningen om URL och HTML. public class LinkExtractor extends HTMLEditorKit.ParserCallback { private URL baseurl; private URL starturl; private List<URL> urllist; public LinkExtractor(URL starturl) { this.starturl = starturl; this.baseurl = this.starturl; this.urllist = new ArrayList<URL>(); public void handlestarttag(html.tag tag, MutableAttributeSet attributes, int position) { if (tag == HTML.Tag.A) { String href = (String) attributes.getattribute(html.attribute.href); urllist.add(new URL(baseURL, href)); catch (MalformedURLException e) { //e.printstacktrace(); if (tag == HTML.Tag.FRAME) { String href = (String) attributes.getattribute(html.attribute.src); urllist.add(new URL(baseURL, href)); catch (MalformedURLException e) { //e.printstacktrace(); public void handlesimpletag(html.tag t, MutableAttributeSet a, int pos) { if (t == HTML.Tag.BASE) { String href = (String) a.getattribute(html.attribute.href); baseurl = new URL(href); catch (Exception e) {

4(6) public List<URL> geturllist() { return urllist; c) Man skulle naturligtvis kunna skriva allt nedan i en och samma main-metod, men för överskådlighetens skull har vi brutit ned koden i mindre metoder. Lösningen nedan innehåller dessutom lite extra finesser, såsom att kontrollera att sidan vi läser faktiskt innehåller text och HTML-kod, som inte krävdes i uppgiften. public class Nedladdare { String targeturlstring; String destfolder; List<URL> linklist; public Nedladdare(String targeturl, String destfolder) { this.targeturlstring = targeturl; this.destfolder = destfolder; public List<URL> extractlinksfromurl(url url) { LinkExtractor callback = null; URLConnection uc = url.openconnection(); String type = uc.getcontenttype().tolowercase(); if ((type!= null) &&!type.startswith("text/html")) { System.out.println(url + " ignored. Type " + type); ParserGetter kit = new ParserGetter(); HTMLEditorKit.Parser parser = kit.getparser(); callback = new LinkExtractor(url); InputStream in = new BufferedInputStream(uc.getInputStream()); InputStreamReader r = new InputStreamReader(in); parser.parse(r, callback, true); catch (IOException e) { System.out.println("Could not read: " + url); //e.printstacktrace(); catch (Exception e) { System.out.println("Could not read: " + url); return callback.geturllist(); public void execute() throws MalformedURLException { URL targeturl = new URL(targetURLString); linklist = extractlinksfromurl(targeturl); String pdffilename; FileOutputStream fwriter; int inx; byte [] buffer = new byte[256];

5(6) for (URL link : linklist) { if (link.tostring().endswith(".pdf")) { System.out.println("Reading link: " + link); inx = link.tostring().lastindexof("/", link.tostring().length()); pdffilename = link.tostring().substring(inx); System.out.println("Writing file: " + pdffilename); fwriter = new FileOutputStream(destFolder + pdffilename); InputStream is = link.openstream(); int cnt; while ((cnt = is.read(buffer, 0, 256))!= -1) { fwriter.write(buffer, 0, cnt); catch (IOException e) { e.printstacktrace(); public static void main(string[] args) throws MalformedURLException { Nedladdare ned; if (args.length == 2) { ned = new Nedladdare(args[0], args[1]); else { System.out.println("Usage: java Nedladdare TargetURL DestinationFolder"); return; ned.execute(); 2. En enkeltrådad version av programmet kommer att spendera mycket tid åt att vänta på nätverksrelaterade saker såsom att uppkopplingar till webbservrar ska ske eller att data ska anlända från servern. Genom att göra programmet flertrådat kan denna tid ägnas åt att parallellt behandla andra uppkopplingar där data finns tillgängligt. På detta sätt kan den totala tiden för nedladdning minskas betydligt. 3. public class Runner extends Thread { Nedladdare ned; String destfolder; public Runner(String destfolder, Nedladdare ned) { super(integer.tostring(name)); this.destfolder = destfolder; this.ned = ned; public void run() { String pdffilename; FileOutputStream fwriter; int inx; byte[] buffer = new byte[256]; URL link; while (true) { if ((link = ned.returnhead()) == null) { return;

6(6) if (link.tostring().endswith(".pdf")) { inx = link.tostring().lastindexof("/", link.tostring().length()); pdffilename = link.tostring().substring(inx); fwriter = new FileOutputStream(destFolder + pdffilename); InputStream is = link.openstream(); int cnt; while ((cnt = is.read(buffer, 0, 256))!= -1) { fwriter.write(buffer, 0, cnt); catch (IOException e) { e.printstacktrace(); 4. public void execute() throws MalformedURLException { URL targeturl = new URL(targetURLString); linklist = extractlinksfromurl(targeturl); for (int i = 0; i < threadcnt; i++) { new Runner(i, destfolder, this).start(); Med ovanstående Runner-version behöver vi dessutom lägga till en synchronized-metod i klassen Nedladdare. Det behövs för att inte två trådar ska kunna hämta samma PDF-fil. Andra lösningar på detta problem är tänkbara, t.ex. att alla trådarna direkt har tillgång till URL-listan. I så fall måste man dock se till att välja en datastruktur för listan som är trådsäker, dvs att flera trådar samtidigt ska kunna försöka ta ut ett element ur listan utan att det blir problem. Om denna funktionalitet implementerats under föregående deluppgift räknas den poängmässigt ändå till denna deluppgift. public synchronized URL returnhead() { if (!linklist.isempty()) { return linklist.remove(0); else {