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

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

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

Tentamen Nätverksprogrammering Lösningsförslag

Tentamen Nätverksprogrammering Lösningsförslag

Tentamen Nätverksprogrammering Lösningsförslag

Tentamen Nätverksprogrammering Lösningsförslag

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

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

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

F8 Meddelandesändning med UDP

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

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

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

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

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

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

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.

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.

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

LÖSNINGSFÖRSLAG

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Objektorienterad Programkonstruktion, DD1346 FACIT. Tentamen , kl

Lösningar för tenta 2 DAT043,

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

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

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

Klasser som datastrukturer

Tentamen. Lösningsförslag

/* * * Lösningsförslag tentamen DIT950 * Datum * */ /* * -1 - */ För samtliga gäller,se föreläsningsanteckningar.

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

F4. programmeringsteknik och Matlab

F9 Meddelandesändning med UDP

Lösningsförslag till exempeltenta 2

Tentamen i Objektorienterad modellering och design

Språkkonventioner och redigering av tal.

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

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

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

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

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

1.1 Runnable och Thread

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

Objektorienterad Programkonstruktion, DD1346. Tentamen , kl

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

Konstruktion av klasser med klasser

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

Laborationer, moment 4 5

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

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

Fördjupad Java. Undantagshantering. Fel

Klasshierarkier - repetition

F8 Webbteknologier 1. Dynamiska webbsidor

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

Tentamen Lösningar EDA698 Realtidssystem

Instuderingsuppgifter läsvecka 6 - LÖSNINGAR

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

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

Objektorienterad programutveckling, fk

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

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Lösningsförslag, tentamen FYTA11 Javaprogrammering

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

OOP Objekt-orienterad programmering

Tentamen LÖSNINGSFÖRSLAG. c) Tilldelningen C x = new D() ger kompileringsfel eftersom klassen D är abstrakt.

Interface. Interface. Tobias Wrigstad (baserat på bilder från Tom Smedsaas) 3 december 2010

Java: Utvecklingsverktyg, datatyper, kontrollstrukturer

DAT043 Objektorienterad Programmering

Exam Concurrent and Real-Time Programming

Objektorienterad programmering i Java

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

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

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

Föreläsning 3. Stack

TENTAMEN OOP

Subklasser och arv Inledning till grafik (JFrame och JPanel). Något om interface. Objektorienterad programvaruutveckling GU (DIT011) Subklasser

Klasshierarkier. Klasser kan byggas på redan definierade klasser

Recitation 4. 2-D arrays. Exceptions

Tentamen i Objektorienterad modellering och design Helsingborg

JAVAUTVECKLING LEKTION 7

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

JAVA Mer om klasser och objektorientering

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Laborationer, moment 4 5

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

TENTAMEN OOP

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

10 Kommunikation i Java

Objektorienterad Programkonstruktion. Föreläsning dec 2015

UML. Klassdiagr. Abstraktion. Relationer. Överskugg. Överlagr. Aktivitetsdiagram Typomv. Typomv. Klassdiagr. Abstraktion. Relationer.

Trådar. Aktiva objekt

SI-pass 4. Johan Brook och Jesper Persson. 25 september Diskutera och svara på om påståendena nedan är äkta sanningar eller listiga lögner.

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.

Tentamen Programmering fortsättningskurs DIT950

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

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

Transkript:

LUNDS TEKNISKA HÖGSKOLA 1(7) Institutionen för datavetenskap Tentamen Nätverksprogrammering Lösningsförslag 2008 05 26, 8.00 13.00 1. a) Raden sent = input.read(buffer); läser in så många bytes (dock max 128) som finns läsbara från TCP-förbindelsen vid lästillfället (om inga bytes går att läsa blockerar den dock tills minst en byte går att läs). Antalet bytes som läses kan alltså variera från 1 till 128. När vi skriver ut bufferten till output skrivs dock alltid 128 bytes. Har mindre lästs in skrivs det alltså ut ett antal extra bytes innehållande skräp på förbindelsen. b) Torrent-Tore borde ändra utskriften till output.write(buffer,0,sent);. På så sätt skrivs bara de bytes som faktiskt lästes ut. 2. Båda teknikerna är javabaserade tekniker som används för att skapa dynamiskt webbinnehåll på serversidan, men det som gör att de verkligen är intimt knutna till varandra är att JSP bygger på servlets. En JSP-specifikation kompileras automatiskt om till en servlet vid behov. 3. a) Data som matats in i inmatningsfält i ett HTML-formulär är exempel på information som kan överföras via en frågesträng. b) Om GET används överförs frågesträngen som en del av den begärda URL:en. Servern får sedan dela upp URL:en i resursdel och frågesträng. I och med att frågesträngen är en del av URL:en syns den i webbläsarfönstrer, vilket möjligen kan vara oönskat, men det medför också att det är möjligt att göra ett bokmärke som innefattar både adress och frågesträng i webbläsaren. Vid POST sänds frågesträngen som en del av de header-rader som följer på POST-kommandot enligt HTTP-protokollet. 4. a) Det nya paketet java.nio har stöd för icke-blockerande I/O och möjlighet att bevaka aktivitet på flera förbindelser parallellt, vilket gör det möjligt att skriva program som hanterar flera parallella förbindelser samtidigt utan att använda sig av trådar. b) Klassen Selector används för att avgöra på vilka förbindelser det går att utföra I/O just nu eller, om ingen I/O är möjlig för tillfället, vänta på att I/O ska bli möjlig på någon av flera parallella förbindelser. 5. a) Det kommer att verka som om bara kortare och kortare meddelanden, typiskt trunkerade, kan tas emot. b) Problemet är att DatagramPacket-objektet innehåller ett längd-attribut som dels talar om hur långt ett mottaget meddelande är samt, om objektet används för att ta emot ett meddelande, talar om hur många bytes av meddelande som maximalt ska sparas i bufferten. När vi återanvänder ett DatagramPacket-objekt måste vi alltså ställa tillbaka längdattributet så att det blir lika med storleken på den tillgängliga bufferten. Ett sätt att lösa problemet är att skapa ett nytt DatagramPacket-objekt varje gång vi ska ta emot ett nytt meddelande. Alternativt kan vi återställa längdattributet i det befintliga objektet: dp.setlength(buf.length);

2(7) 6. Det centrala objektet vid parsning av HTML i Java är ett objekt av typen javax.swing.html.htmleditorkit.parser. Detta objekt innehåller en metod parse som genomför själva parsningen av sidan. För att skapa objektet finns det en metod i javax.swing.html.htmleditorkit som heter getparser. Tyvärr är denna deklarerad protected så för att kunna anropa den är man tvungen att subklassa javax.swing.html.htmleditorkit och skriva en egen public-deklarerad metod som gör anropet. Som inparametrar till parse anger man dels en Reader som är en öppen förbindelse till webbservern/sidan som ska parsas. Denna erhålles m.h.a ett URL-objekt som representerar sidan som ska parsas. En andra parameter till parse är ett objekt av typen javax.swing.html.htmleditorkit.parsercallback. När parsern stöter på olika HTML-element i sidan, t.ex. olika typer av start- och slut-taggar för hyperlänkar o.d. kommer parsern att anropa metoder i ParserCallback-objektet som representerar den aktuella taggen. Genom att skapa en subklass till ParserCallback och överlagra dessa metoder kan vi styra vad som ska hända när parsern stöter på respektive tagg. 7. 1) falskt 2) sant 3) sant 4) falskt 8. RTP är ett protokoll avsett för överföring av ljud och bild i realtid, även om protokollet i sig strikt taget inte garanterar realtidsöverföring. Det är ett paketbaserat protokoll som tillhandahåller identifikation av mediatyp, tidsstämplar och sekvensnummer. Det kräver tillägg i form av ett applikationslager för att hantera paket som inte kommer i rätt ordning, jitter och för att kompensera för paketförluster. RTCP är en del av RTP-protokollet som används för att förmedla statistik för förbindelsen mellan sändare och mottagare. Exempel på information som överförs är jitterdata, paketförluster och antal sända paket. RTSP är ett HTTP-liknande protokoll som används för att kontrollera uppspelningen av strömmande media. Man kan likna det med en fjärrkontroll med funktioner för att starta, stoppa och pausa uppspelningen. 9. Det finns risk för dödläge (deadlock) vid körning av koden. Dödläge kan typiskt uppstå när det förekommer i programmet att trådar låser en resurs, t.ex. en monitor, och sedan försöker låsa ytterligare en resurs. Det krävs då dessutom att den andra resursen redan är låst av en annan tråd som i sin tur därefter försöker låsa den första resursen. Då kommer den första tråden att stå och vänta på att den andra tråden släpper en resurs, men det kan den inte göra eftersom den i sin tur väntar på att den första tråden ska släppa sin resurs. Man kan även tänka sig situationer med fler trådar och längre beroendekedjor inblandade. I det aktuella fallet blir det praktiskt taget garanterat dödläge därför att båda trådarna börjar med att låsa varsin monitor (anropar m1 i respektive monitor) och sedan, efter en sekunds väntetid och medan monitorn fortfarande är låst, i sin tur låsa den andra monitorn.

3(7) 10. a) MessageStoreImpl.java import java.util.*; class MessageStoreImpl implements MessageStore { class Message { private String receiver; private String message; public Message(String r, String m) { receiver = r; message = m; public String getreceiver() { return receiver; public String getmessage() { return message; private ArrayList<Message> messages = new ArrayList<Message>(); private Message find(string receiver) { for(message m : messages) { if (m.getreceiver().equals(receiver)) { return m; return null; public synchronized void addmessage(string receiver, String message) { messages.add(new Message(receiver,message)); notifyall(); public synchronized String nextmessage(string receiver) { Message m = find(receiver); while (m==null) { wait(); catch(interruptedexception e) { m = find(receiver); messages.remove(m); return m.getmessage();

4(7) b) MessagePassing.java import java.io.*; public class MessagePassing { public static void main(string[] args) { MessageStore messages = new MessageStoreImpl(); ServerSocket server = new ServerSocket(12345); while(true) { Socket s = server.accept(); new ClientHandler(messages,s).start(); catch(ioexception e) { System.out.println("Fatal I/O error in server thread."); System.exit(1); ClientHandler.java import java.io.*; class ClientHandler extends Thread { private MessageStore messages; private Socket client; public ClientHandler(MessageStore m, Socket c) { messages = m; client = c; public void run() { DataInputStream dis = new DataInputStream(client.getInputStream()); DataOutputStream dos = new DataOutputStream(client.getOutputStream()); char command = dis.readchar(); String receiver = dis.readutf(); if (command== w ) { String message = dis.readutf(); messages.addmessage(receiver, message); else { dos.writeutf(messages.nextmessage(receiver)); catch(ioexception e) { // terminate thread in case of I/O error finally { client.close(); catch(ioexception e) {

5(7) MessageClient.java import java.io.*; public class MessageClient { private String server; * Constructor. * @param server The network address of the server to connect to. public MessageClient(String server) { this.server = server; * Send a message to a receiver. * @param message The message to send. public void send(string receiver, String message) { Socket socket = null; socket = new Socket(server,12345); DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); dos.writechar( w ); dos.writeutf(receiver); dos.writeutf(message); catch(ioexception e) { // terminate call in case of I/O error finally { if (socket!=null) { socket.close(); catch(ioexception e) { * Returns the next message for this client. If no message is available, * the method blocks until a message arrive. * @returns The message. public String receive(string receiver) { Socket socket = null; String message = null; socket = new Socket(server,12345); DataInputStream dis = new DataInputStream(socket.getInputStream()); DataOutputStream dos = new DataOutputStream(socket.getOutputStream()); dos.writechar( r ); dos.writeutf(receiver); message = dis.readutf(); catch(ioexception e) { // terminate call in case of I/O error finally {

6(7) if (socket!=null) { socket.close(); catch(ioexception e) { return message; c) MessageRMIServer.java interface MessageRMIServer extends Remote { void addmessage(string receiver, String message) throws RemoteException; String nextmessage(string receiver) throws RemoteException; MessageRMIServerImpl.java import java.rmi.server.unicastremoteobject; class MessageRMIServerImpl extends UnicastRemoteObject implements MessageRMIServer { private MessageStore messages; public MessageRMIServerImpl() throws RemoteException { super(); messages = new MessageStoreImpl(); public void addmessage(string receiver, String message) throws RemoteException { messages.addmessage(receiver, message); public String nextmessage(string receiver) throws RemoteException { return messages.nextmessage(receiver); MessagePassing.java public class MessagePassing { public static void main(string[] args) { MessageRMIServer server = new MessageRMIServerImpl(); Naming.rebind("MessageServer", server); catch(remoteexception e) { e.printstacktrace(); catch(malformedurlexception e) { e.printstacktrace();

7(7) MessageClient.java public class MessageClient { private MessageRMIServer server; * Constructor. * @param server The network address of the server to connect to. public MessageClient(String server) { this.server = (MessageRMIServer) Naming.lookup("rmi://"+server+"/MessageServer"); catch(remoteexception e) { catch(malformedurlexception e) { catch(notboundexception e) { * Send a message to a receiver. * @param message The message to send. public void send(string receiver, String message) { if (server!=null) { server.addmessage(receiver, message); catch(remoteexception e) { * Returns the next message for this client. If no message is available, * the method blocks until a message arrive. * @returns The message. public String receive(string receiver) { String message = null; if (server!=null) { message = server.nextmessage(receiver); catch(remoteexception e) { return message;