Örebro universitet
Institutionen för teknik
Thomas Padron-McCarthy (Thomas.Padron-McCarthy@tech.oru.se)







Omtentamen i

Programmering i Java

för Dataingenjörsprogrammet m fl

tisdag 16 augusti 2005 kl 08:00 - 13:00 i L003







Hjälpmedel: Inga hjälpmedel.
Poängkrav: Maximal poäng är 40.
För betyget 3 krävs 20 poäng.
För betyget 4 krävs 27 poäng.
För betyget 5 krävs 33 poäng.
Resultat och lösningar: Meddelas på kursens hemsida senast tisdag 6 september 2005.
Visning: Tid för visningen meddelas samtidigt som resultatet.
Efter visningen kan tentor hämtas på expeditionen.
Examinator och jourhavande: Thomas Padron-McCarthy, telefon 0707-347013.



LYCKA TILL!

Skriv inte svaren till uppgifterna direkt här, utan skriv på lösa blad och lämna in.

Uppgift 1 (3p)

Äldre programmeringsspråk, som C, C++ och Ada, brukar kompileras till maskinkod som kan köras av en viss processor. Java kompileras i stället till kod som kan köras av en virtuell maskin.

a) (1p)

Hur skiljer sig denna virtuella maskin från en vanlig maskin, till exempel den här datorn med en Pentium-processor som står här på mitt skrivbord?

b) (2p)

Vilka fördelar och nackdelar finns med att kompilera till en virtuell maskin?

Uppgift 2 (5p)

Skriv Java-programmet UndersökArgument, som ska gå igenom de kommandoradsargument som ges när programmet startas, och sen skriva ut hur många av dem som är tillåtna heltal samt deras summa. Körexempel:
prompt> javac UndersökArgument.java
prompt> java UndersökArgument hej 7 hopp -17 4711
3 tillåtna heltal.
Summan är 4701.
prompt> 

Uppgift 3 (12p)

Ett chattsystem består av en server och flera klienter:

Chatt-system

Idén är att när någon användare skriver en rad i sin klient, ska raden genast skickas till servern, som skickar vidare raden till alla de andra klienterna. Var och en av de andra klienterna ska sen visa raden.

a) (1p)

Servern bör använda flera trådar. Varför? Om man ändå skriver en enkeltrådad server, vilket beteende kan man då få i systemet?

b) (1p)

Även klienten bör använda flera trådar. Varför? Om man ändå gör klienten enkeltrådad, vilket beteende kan man då få i systemet?

c) (10p)

Skriv klienten. Den behöver inte vara grafisk. Servern kör på port 3000 på datorn chat.oru.se. För full poäng på uppgiften krävs att klienten är flertrådad. En lösning utan flera trådar ger maximalt fem poäng på deluppgift c.

Uppgift 4 (20p)

De duktiga och flitiga teknikerna i institutionens datasupportgrupp behöver ett system som fungerar som en "betjäntknapp". Systemet ska bestå av en Java-applet, som varje användare kan köra på sin dator, och en Java-applikation, som fungerar som server och som körs på datasupportgruppens gemensamma dator. Den datorn heter support.tech.oru.se.

När en användare trycker på Hjälp!-knappen ska ett meddelande dyka upp på datasupportgruppens skärm, så att en av dem genast kan springa iväg och hjälpa användaren.

För enkelhets skull kan vi anta att varje applet ska få ett klientnummer när den kopplar upp sig mot servern, och att det klientnumret visas både för användaren och för datasupportgruppen. (De får väl springa runt och fråga alla användarna vem som har det numret, när de fått en begäran om hjälp.)

Appleten ska också ha en Fortare!-knapp, som användarna kan använda om de tycker att datasupportgruppen dröjer för länge med att komma och hjälpa till. Den ska ge upphov till ett lämpligt "skynda på!"-meddelande hos datasupportgruppen.

Så här kan appleten se ut:

En bild på appleten, med två knappar

Så här kan servern se ut:

En bild på servern

Det finns inga krav på att appleten eller applikationen ska se ut exakt som på bilderna.

Det är inte nödvändigt att göra en grafisk serverapplikation, men en rent textbaserad server ger max 15 poäng på hela uppgiften. (Det räcker dock om serverapplikation visar meddelandena som text i ett fönster, som i exemplet ovan.)

Några tips:

Deluppgifter:

a) (4p)

Skapa ett protokoll för kommunikationen mellan appleten och servern. Beskriv hur protokollet fungerar, och ge exempel på hur kommunikationen kan se ut.

b) (6p)

Skriv appleten.

c) (10p)

Skriv servern. För full poäng på uppgiften måste servern ha ett grafiskt gränssnitt.

Bilaga: Utdrag ur API-specifikationen

java.net
Class ServerSocket

java.lang.Object
  extended byjava.net.ServerSocket

ServerSocket(int port)
          Creates a server socket, bound to the specified port.

Socket accept()
          Listens for a connection to be made to this socket and accepts it.

void close()
          Closes this socket.




java.net
Class Socket

java.lang.Object
  extended byjava.net.Socket

Socket()
          Creates an unconnected socket, with the system-default type of SocketImpl.

Socket(InetAddress address, int port)
          Creates a stream socket and connects it to the specified port number at the specified IP address.

void close()
          Closes this socket.

InputStream getInputStream()
          Returns an input stream for this socket.

OutputStream getOutputStream()
          Returns an output stream for this socket.

java.io
Class BufferedReader

java.lang.Object
  extended byjava.io.Reader
      extended byjava.io.BufferedReader

BufferedReader(Reader in)
          Create a buffering character-input stream that uses a default-sized input buffer.

void close()
          Close the stream.

int read()
          Read a single character.

String readLine()
          Read a line of text.




java.io
Class InputStreamReader

java.lang.Object
  extended byjava.io.Reader
      extended byjava.io.InputStreamReader

InputStreamReader(InputStream in)
          Create an InputStreamReader that uses the default charset.

void close()
          Close the stream.

int read()
          Read a single character.

java.io
Class PrintWriter

java.lang.Object
  extended byjava.io.Writer
      extended byjava.io.PrintWriter

PrintWriter(OutputStream out)
          Create a new PrintWriter, without automatic line flushing, from an existing OutputStream.

PrintWriter(OutputStream out, boolean autoFlush)
          Create a new PrintWriter from an existing OutputStream.

void close()
          Close the stream.

void println()
          Terminate the current line by writing the line separator string.

void println(String x)
          Print a String and then terminate the line.

java.net
Class InetAddress

java.lang.Object
  extended byjava.net.InetAddress

public static InetAddress getByName(String host)
                             throws UnknownHostException
          Determines the IP address of a host, given the host's name.