Till KTH:s startsida Till KTH:s startsida

Projektuppgift

Projektuppgift (LAB2 2,0 hp)

Projektuppgiften består av en större programmeringsuppgift. Detta moment ger 2 hp, och kan ges betyg A, B, C eller E.

Det har kommit ett antal frågor om projektuppgiften. De återfinns tillsammans med sina svar på en QA-sida. Om ni har frågor som inte besvaras av denna sida, skicka ett mail till kursansvarig eller skriv er fråga på KTH Social. Frågor med förväntat allmänintresse kommer att läggas till på QA-sidan.

Betyg E

För betyg E på detta moment krävs att man presenterat en godkänd projektplan (E1) och redovisat ett program som uppfyller samtliga specifikationer (E2). Precis som i labbarna krävs att båda i gruppen kan redogöra för alla delarna av uppgiften, och förklara vad olika delar av koden gör och varför ni har valt att göra som ni gör.

Bonuspoäng

Godkänd redovisning av moment E1 senast den 31:a 30:e januari ger ett bonuspoäng till del I på tentamen, godkänd redovisning av moment E2 senast den 6:e mars ger ett bonuspoäng till del I. Totalt kan alltså projektuppgiften ge 2 bonuspoäng till del I.

E1 Projektplan

Er projektplan ska presenteras med en beskrivning av ert GUI, med bilder. Förklara hur användaren interagerar med programmet vid användningen av olika funktioner, och hur detta hanteras intern i programmet. Projektplanen ska dessutom innehålla en komplett UML-beskrivning av hur det färdiga programmet förväntas se ut. UML-diagrammet ska beskriva samtliga klasser som man har konstruerat själv, inklusive deras fält och metoder. Om det behövs för överskådlighet kan man göra flera UML-diagram - dels ett överskådligt som visar de stora sambanden men utelämnar detaljerna, och ett eller flera detaljerade som beskriver de olika delarna. Om ni anser att ni behöver ytterligare diagram eller texter för att förklara er kod får ni givetvis göra det. Som riktlinje kan ni ha att er redovisning av planen ska vara tillräcklig för att en programmerare på samma nivå som en genomsnittlig kursdeltagare ska kunna implementera ert projekt.

E2 Programspecifikationer

Projektuppgiften går ut på att skriva ett program som gör så att man kan skicka textmeddelanden mellan två olika datorer, sk IM (Instant Messaging). Programmet ska uppfylla följande krav:

  1. Programmet ska ha ett grafiskt användargränsnitt för all funktionalitet
  2. Det ska gå att ange om man vill att programmet ska köra som server eller som klient.
  3. Som server ska man kunna ange en specifik port där programmet lyssnar på inkommande upkopplingar. Programmet ska upprätta kontakt med ett annat program som kopplar upp sig mot denna port.
  4. Som klient ska man kunna ange en nätverksadress och en port att ansluta sig till. Om det finns en väntande server på den angivna adressen skall en kontakt upprättas.
  5. Det ska finnas ett textfält där man kan mata in text som skickas till programmet man är uppkopplad mot.
  6. Det ska finnas ett annat textfält där man kan se dels det man själv skickat, och dels det som skickats från det program man är uppkopplad mot.
  7. Man ska kunna ange sitt eget namn, och för alla textmeddelanden som visas så ska namnet på den som skrivit det skrivas ut.
  8. Man ska kunna ange vilken färg man vill att ens text ska ha, och texten ska visas i denna färg både i det egna programmet och hos mottagaren.
    exempel på hur det kan se ut:
    Putte: Hej! Hur står det till?
    Anna: Hej själv! Bara bra
    Putte: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
    Anna: TL;DR
    Anna: Nu måste jag sova. Hej då
    Putte: Hejdå!
  9. Kommunikationen ska ske med TCP/IP sockets, och alla meddelanden skickas som XML. Giltiga tags som måste kunna hanteras är:
    • <message></message> - detta tag-par skall innesluta hela meddelandet, och kan ta attributet sender="namn", där namn förstås är namnet på den som skickat meddelandet.
    • <text></text> - detta tagpar skall innesluta den del av meddelandet som innehåller text som skickas, och kan ta attributet color="#RRGGBB", där #RRGGBB är färgen angiven som RGB-värde i hexadecimalkod.
    • Om man vill får man använda stiltaggarna <fetstil></fetstil> och <kursiv></kursiv>, men det är inte ett krav. Om man inte tänker hantera dessa taggar skall de ignoreras, och texten mellan dem skall visas i vanlig stil.
    • Ert program behöver inte kunna visa meddelanden som innehåller trasig XML-kod, dvs med omatchade taggar, omatchade citat-tecken eller omatchade par av '<' och '>'. Om det kommer ett trasigt meddelande kan ni välja att inte visa det alls, utan bara ange ett felmeddelande (t.ex "Nu kom det ett trasigt meddelande!"), eller försöka visa så mycket som möjligt av meddelandet, tillsammans med en varningstext om att meddelandet var trasigt och kanske inte visas korrekt. Notera att ni måste hantera all tänkbar text som användare skriver in så att denna inte genererar trasig XML, utan kommer fram som avsett. Om användaren vill skicka text som innehåller XML, t.ex för att förklara XML-syntax för en kompis, så måste man kunna göra det. Använd er av de konventioner som finns i HTML för att konvertera relevanta tecken. Dvs, > kodas som &gt; och < kodas som &lt; osv.
    • Meddelande-delar som innesluts av okända tag-par (eller som inte innesluts av något tag-par alls) ska ignoreras helt. Okända attribut i kända taggar skall också ignoreras, och taggarna hanteras som om de inte hade dessa attribut. Detta gör att erat program kan kommunicera med mer avancerade versioner utan att haverera.
  10. Det ska finnas en avstängningsknapp. När ett program stängs av skall programmet man är uppkopplad mot visa detta på ett lämpligt sätt, t.ex genom att skriva ut "Putte har loggat ut". Detta möjliggörs genom att man skickar ett nerkopplingsmeddelande innan man kopplar ner. Detta har de vanliga <message>-taggarna, och inkluderar den ensamma taggen <disconnect /> inne i meddelandet.
  11. Koden skall följa gängse stilkonventioner! Detta inkluderar vettiga kommentarer.

Betyg A, B och C

För betyg C krävs det dels att man uppfyller alla krav för betyg E, och dels att man uppfyller kravspecifikationerna för minst en av extrauppgifterna C1 och C2 nedan. För betyg B krävs det dels att man uppfyller alla krav för betyg E, och dels att man uppfyller kravspecifikationerna för extrauppgiften B1 nedan. Om man uppfyller kraven för samtliga extrauppgifter (C1, C2 och B1) får man betyget A på detta moment. När man redovisar sin projektplan ska den även innehålla alla extrauppgifter man tänker göra.

C1 Kryptering

I denna extrauppgift ska ni förse ert program med möjligheten att kryptera meddelanden. För att få godkänt på denna uppgift krävs att programmet upfyller följande specifikationer:

  1. Man ska kunna välja mellan minst två olika sorters kryptering
  2. Ett av de valbara kryptona ska vara AES, ett ska vara ett Caesarkrypto
  3. Ett krypterat meddelande ska ha ett okrypterat tagpar av typen <message> som innesluter meddelandet. De delar av meddelandet som krypteras ska inneslutas i (det okrypterade) tagparet <encrypted></encrypted>, som tar attributet type="XXXX", där XXXX är namnet på kryptot som används. Giltiga namn är t.ex "AES", "blowfish", "caesar", "RSA". Vill ni kunna använda andra krypton får ni använda valfria namn, men meddela gärna kursledaren, så lägger jag till dem till listan, så att ni kan skicka krypterade meddelanden till varandra. Ett annat attribut som ni kan ange är key="YYYY", där YYYY är nyckeln. För caesarkrypto bör det vara ett heltal, och för krypton med privata och publika nycklar bör ni ange den publika nyckeln här.
  4. Krypterade meddelandedelar, liksom kryptonycklar, kan innehålla godtyckliga tecken. För att förenkla meddelande-parsningen ska alla nycklar eller kryperade meddelandedelar konverteras till hexadecimalkod och skickas som en textsträng bestående av tecknen '0'-'9' 'A'-'F' Varje byte kodas alltså med två tecken. Hexadecimalkoden koverteras tillbaka till bytes innan man avkrypterar. Använd UTF-8 för teckenkonvertering.
  5. För att få reda på en annan användares publika nyckel kan man skicka ett meddelande innehållandes en <keyrequest>, med attributet type="XXXX", som tar samma värden som ovan. Man ska kunna skicka med ett meddelande inneslutet i keyrequest-taggparet som visas för motparten. Om motparten inte har skickat ett svar innehållandes en publik nyckel av rätt sort inom en minut skall den anses inte kunna hantera krypton av den aktuell sorten. Detta ska framgå för användaren, så att denne inte kan försöka skicka krypterade meddelanden till någon som inte kan ta emot dem. Ett program som stöder kryptering skall givetvis skicka ett lämpligt svar på en nyckelbegäran.
  6. Det ska gå att byta mellan olika krypton, och mellan krypterat/okrypterat när som helst. Ett meddelande kan innehålla flera delar med olika kryptering av olika delar. Ert program behöver inte kunna hantera nästade krypton, dvs att man krypterad delar inuti ett redan krypterat meddelande.
  7. Om ni siktar på A-betyg och gör uppgift B1 också, måste man förstås kunna hålla reda på vilken kryptering som gäller för vilken mottagare.

OBS Kryptering är en svår konst. Inom ramarna för den här kursen gör vi inte riktig säker kryptering. För de som vill lära sig att kryptera saker på riktigt rekommenderas kursen DD2448 Kryptografins Grunder.

C2 Filöverföring

I denna extrauppgift ska ni lägga till möjligheten att skicka filer mellan olika användare. För att få godkänt på denna uppgift krävs att programmet upfyller följande specifikationer:

  1. Om man är uppkopplad i konversation med en annan anvämndare ska man kunna välja att skicka en fil till denne.
  2. Man ska kunna välja en fil från sitt filsystem med ett GUI. När man väljer att skicka en fil ska man kunna skicka med en egen text om filen.
  3. När man har valt en fil att skicka ska ens program först skicka ett meddelande till motparten för att fråga om denne vill ta emot filen. Detta meddelande skall förstås vara inneslutet i sedvanliga <message>-taggar.
  4. Själva förfrågan ska inneslutas i tagparet <filerequest>, som tar attributen name="filnamn", där filnamn är namnet på filen man vill skicka. Vidare finns attributet size="XXXX", där XXXX är filens storlek i Byte. Texten mellan taggparen är användarens text om filen.
  5. En användare som får en filförfrågan skickad till sig ska få upp all information om filen, och kunna välja att tacka ja eller nej till att ta emot filen, och ges möjligheten att lägga till ett eget textmeddelande, tex. "tack gärna!", eller "filen är för stor, skicka en mindre!".
  6. Svaret på en filförfrågan ska använda sig av <fileresponse>-taggparet, med attributen reply="X", där X kan vara antingen "yes" eller "no", och port="XXXX", där XXXX är portnummret.
  7. Om man har fått svaret "yes" skall filen skickas. Om man fick svaret "no" skall filen inte skickas.
  8. Medan man väntar på svar angående filen måste man kunna ta emot vanliga meddelanden och visa dessa.
  9. Om man inte har fått ett giltigt svar angående filen inom en minut skall det klassas som om ett "no"-svar har angetts
  10. När/om filen skickas skall både avsändaren och mottagaren få se en 'progress bar' som visar hur stor del av filen som skickats. Det är frivilligt att lägga till information om hur lång tid som filskickandet hittills har tagit, och/eller hur lång tid som tros vara kvar.
  11. Själva filsändandet ska gå över en separat uppkoppling över en separat socket, så att man fortfarande kan kommunicera medan filen sänds. Filen kan sändas som en ström av Bytes, och behöver inte paketeras i XML;
  12. Om ni siktar på A-betyg och gör uppgift B1 också, måste man kunna välja vilken av de andra användarna som en fil ska skickas till. Filöverföring i multipartläge sker bara mellan multipartservern och någon av klienterna. Vill de anslutna klienterna skicka filer till varandra får de upprätta en egen direktkontakt.
  13. Om ni siktar på A-betyg och gör uppgift C1 också, får man göra så att det går att kryptera själva filen. Då får man lagga till attributen type och key i <filerequest>-taggen. Det är lämpligt att den som svarar på filförfrågan anger sin publika nyckel i svaret på filförfrågan. Det är inte ett krav att implementera krypterad filöverföring.

B1 Flera användare

Denna uppgift går ut på att göra det möjligt att ansluta till flera andra användare samtidigt. För godkänt på denna extrauppgift krävs att ens program uppfyller följande:

  1. Man ska kunna ansluta till minst 3 andra användare.
  2. Ni ska kunna ha separata textfält för konversationer med de olika användarna. Rätt text ska skickas till rätt motpart.
  3. Ert program ska dessutom kunna fungera som en server för sk multipart-konversationer, dvs alla meddelanden som skrivs av någon användare skall ses av alla. Detta ska fungera även om alla andra användare använder den enklare versionen av programmet från del E.
  4. Det ska gå att koppla bort en enskild annan användare utan att kommunikationen med de andra störs. Detta ska fungera oavsett vem som kopplade ner (man själv eller motparten). Om man kopplar ner fullständigt bryts förstås kontakten med alla uppkopplade.
  5. Ens program ska fungera både som klient och server, dvs, det ska kunna hantera inkommande uppkopplingsförsök när som helst, och det ska kunna koppla upp sig mot andra program när som helst.
  6. När ett annat program vill koppla upp sig ska användaren av ert program kunna se vem som försöker koppla upp sig, och kunna välja att tillåta eller inte tillåta en uppkoppling. För att underlätta detta ska ni använda ett alternativ XML-tagpar, <request> </request>. Texten som innesluts av detta taggpar ska visas för användaren när denne bestämmer om hen ska tillåta uppkopplingen. Om någon försöker ansluta med en klient som inte implementerar uppgift B1, så ska användaren ges ett meddelande om att det verkar som om en enklare klient vill ansluta, och fråga om hen vill tillåta detta.
  7. Om man svarar ja ska en koppling upprättas, och om man svarar nej ska ett meddelande med <request>-taggar och attributet reply="no" skickas tillbaka. Detta kräver förstås att en tillfällig uppkoppling upprättas. Om förfrågan kom från en klient utan stöd för del B1, skall svaret skickas som ett vanligt textmeddelande.
  8. Om det finns en övre gräns på hur många andra användare som får ansluta sig, och denna redan är nådd, ska ett automatgenererat nejsvar skickas tillbaka. Användaren ska meddelas om att någon har försökt ansluta sig.

Lärare Christian Smith skapade sidan 17 oktober 2013

Christian Smith flyttade sidan från Objektorienterad programkonstruktion (DD1346) 17 oktober 2013

kommenterade 27 januari 2014

På QA-sidan står följande:

"F: När man ansluter till en multipart-konversation, vilket är protokollet för att tala om för servern vilken konversation man vill ansluta sig till?
S: En server kör bara en multipart-konversation. Det är den man ansluter till. Om D vill ansluta till konversationen mellan A, B och C ovan, så gör D detta genom att ansluta på vanligt vis till A. Det finns inget i protokollet som skiljer detta från en anslutning till en annan användare i en tvåpartskonversation. Om man vill kan man låta A skicka ett automatiskt text-meddelande om att D har anslutit till en multipart-konversation med B och C, men det är inget krav."

Dock vill jag från en föreläsning minnas att det sades att en B1-server ska klara att ha både en multipart-konversation och lite singelkonversationer vid sidan av, dvs inte bara vara i "multipart mode". Vilket är det som gäller?

Lärare kommenterade 27 januari 2014

En B1-klient ska kunna köra antingen en multipart, eller flera singel-konversationer.

Om man vill får man lägga till förmågan att ha flera multipart-konversationer, men det är inget krav. Protokollet har inget explicit stöd för att ange vilken multipart-chat man vill ansluta till (bland annat eftersom även en E-klient ska kunna ansluta), så det lämnas till multipart-servern att bestämma självsvåldligt hur den vill hantera inkommande samtal.

kommenterade 4 februari 2014

"Ett krypterat meddelande ska ha ett okrypterat tagpar av typen <message> som innesluter meddelandet."
Betyder det att man även får lämna attributet "sender='namn'" okrypterat?

kommenterade 4 februari 2014

Och kan man få anta att alla har unika namn?

Lärare kommenterade 4 februari 2014

Eftersom sender-attributet finns i message-taggen, som ska vara okrypterat, blir alltså även namnet okrypterat.

Man kan inte anta att alla har unika namn. Det är dessutom möjligt att någon bestämmer sig för att byta namn under pågående konversation.

kommenterade 4 februari 2014

Jag har en fråga om nycklarna för de krypterade meddelandena. Ska man ha en nyckel för varje kryptering (en för AES och en för Caesar) eller en nyckel för varje meddelande, alltså att man genererar en ny nyckel varje gång man krypterar ett meddelande?

Lärare kommenterade 4 februari 2014

Om man skickar med en nyckel i meddelandet så antar man att det är den som ska användas. Om man inte skickar med någon nyckel så antar man att den senast överförda nyckeln används. Om ingen nyckel har överförts, men man vill undvika att skicka med någon nyckel så kan man fråga motparten om en nyckel med en keyrequest. Detta är förstås mest meningsfullt för assymetriska krypton.

kommenterade 6 februari 2014

En fråga om stilkonventioner. När man kommenterar en rad med kod, får man överstiga 80 tecken per rad eller ska man göra en /* */ kommentar innan raden? Ibland är det svårt att förklara en initiering av något med få tecken.

Lärare kommenterade 6 februari 2014

En längre kommenter skall radbrytas, precis som du föreslår med /*... */

Se utdrag ur stilguiden:

5.1.2 Single-Line Comments

Short comments can appear on a single line indented to the level of the code that follows. If a comment can't be written in a single line, it should follow the block comment format (see section 5.1.1). A single-line comment should be preceded by a blank line. Here's an example of a single-line comment in Java code (also see "Documentation Comments" on page 9):

kommenterade 14 februari 2014

I C1§5 står "Ett program som stöder kryptering skall givetvis skicka ett lämpligt svar på en nyckelbegäran", betyder det alltså att vi förväntas utöka protokollet på ett lämpligt sätt? Typ lägga till en "keyresponse"-tagg? Eller finns det redan möjlighet att på något sätt meddela alla tänkbara svar på detta, t.ex.:

  • stöder inte krypton
  • stöder krypton men inte den typen
  • stöder kryptotypen, men användaren har inte specifierat (alt. skapat) någon nyckel än (eller ekvivalent använder avbryter specifikationen om man visar en popup)
  • stöder kryptot - här är nyckeln

Som jag har förstått det så lades keyrequest-taggen delvis till för att program ska kunna fråga andra program om det stöder krypton, varför är då inte en svarstagg specifierad i protokollet?

Lärare kommenterade 15 februari 2014

En förutsättning är att motparten när som helst (oombedd) kan dela med sig av sina nycklar. Alltså är det ingen skillnad på att besvara en keyrequest och att spontant dela med sig av sina nycklar. Om man stöder kryptot så svarar man med ett meddelande som innehåller en encrypted-tagg, med attributen för typ och nyckel satta.
Om man inte stöder krypto så svarar man helt enkelt inte på keyrequesten, och en timeout tolkas som ett nej. Detta innebär att även E-klienter kan besvara en keyrequest korrekt.
 Acceptabla sätt att besvara era fyra scenarier blir alltså:

  • stöder inte krypton: Svara helt enkel inte på keyrequest:en
  • Stöder krypton, men inte den här typen: Antingen svarar man inte alls, eller så svarar man med en encrypted med den typen man föredrar.
  • Stöder krypton, men har ingen nyckel: Det här borde inte uppstå. Man kan nog anse att programmet inte stöder denna typ förrän nyckel har skapats, se då föregående punkt. Dock tycker jag att ert program alltid borde skapa nycklar vid uppstart.
  • Stöder kryptot, här är nyckeln: svara med en encrypted-tagg med rätt typ och nyckel.

Hur man hanterar alternativ 1 och 4 är ganska rättframt. Att det finns flera sätt att besvara alternativ 2 betyder att att man inte kan anta att ett annat program inte stöder krypton alls bara för att de inte besvarar en specifik förfrågan. Ett väluppfostrat program besvarar förstås en keyrequest med en ej stödd sort genom att skicka en nyckel för en typ det stöder.

kommenterade 26 februari 2014

Hej!

Jag har en fråga gällande disconnect taggen, ska den vara innuti en text tagg eller innuti en message tagg (dvs inte ha någon text tagg i meddelandet)? alltså ska det vara enligt ex 1 eller två (låtsas att attributen till taggarna är ifyllda).

ex. 1 <message><text><disconnect /></text></message>

ex. 2 <message><disconnect /></message>

Lärare kommenterade 26 februari 2014

Hej!
Enligt spec:en blir det tolkning 2.
Om det var otydligt och någon har implementerat enligt tolkning 1, så är det OK, men det borde vara trivialt att ändra i de allra flesta fall.

kommenterade 2 mars 2014

När är sista datum för att redovisa (eller att för högre betyg kompletteringsredovisa) lab 6 och projektet? 

Lärare kommenterade 2 mars 2014

Sista ordinarie tillfälle är på torsdag, 6:e mars. Om man inte hinner färdigt till dess kan man få redovisa på ett kompletteringstillfälle senare i vår, annars blir det nästa kursomgång, i period 2 i höst.

En användare har tagit bort sin kommentar
kommenterade 2 mars 2014

Och det senare tillfällena gäller även för att höja betyget?

Lärare kommenterade 3 mars 2014

Ja. Dock är det så att om det blir för många som vill redovisa på kompletteringstillfällena, så kommer vi att prioritera de som behöver få godkänt framför de som vill höja ett redan godkänt betyg.

kommenterade 6 mars 2014

Hej allihop!

När jag tagit emot redovisningar i veckan har ett par problem dykt upp på flera ställen, så jag tänkte att det är lika bra att berätta om dem i förväg. Då kan ni testa och se att det funkar redan innan ni kommer till redovisning ikväll.

  • När chatt-klienten kopplar ifrån, ska ett meddelande med <disconnect />-tagg skickas till motparten oberoende av varför programmet kopplar från. Med andra ord, det ska inte spela någon roll ifall användaren avslutar genom att trycka på en JButton, på krysset i hörnet av programfönstret, på Alt+F4, etc... Flera grupper har här antingen krävt att man använder deras Quit-knapp, eller t.o.m. att man kommer ihåg att klicka på en Disconnect-knapp innan man avslutar. Det ska alltså inte krävas - att avsluta programmet på vilket sätt som helst ska fungera likadant.

    Om koden är välskriven bör detta vara ett ganska litet ingrepp - se helt enkelt till att koden som skickar <disconnect /> körs när programmet avslutas. Om ni har svårt att få det att fungera, är det också möjligt att deaktivera vissa sätt att avsluta programmet, och t.ex. tvinga användaren att använda er JButton genom att ta bort krysset i hörnet. (Google är er vän...)

  • Flera grupper har också gjort en för enkel lösning på xml encoding, där meddelanden som innehåller taggar skickas och visas korrekt, medan meddelanden som innehåller lite klurigare grejer inte gör det. Ni kan testa med bl.a. föjlande teckensekvenser (en notera att listan inte är uttömmande - det finns andra saker som också ska fungera. Ni måste vara lite smarta! ;) )
    • </text>
    • &lt;/text>
    • <disconnect /&rt;
    • &amp;
    • &ouml;
    • &aelig;

Dessa två grejer ska funka för alla klienter, E-nivå och uppåt.