Java-programmering GUI-exempel GUI UDP Trådar Laboration 2 Tips main Skapa GUI Rita på skärmen Sätt vem som ska lyssnas på 2/11-00 Datakommunikation - Jonny Pettersson, UmU 1 2/11-00 Datakommunikation - Jonny Pettersson, UmU 2 Händelsestyrt Uppdatering Händelse 2/11-00 Datakommunikation - Jonny Pettersson, UmU 3.java import java.awt.*; // Denna klass innehåller själva funktionaliteten för // programmet, dvs update label. Kan även sägas vara huvudklass. // Har en main-funktion och instansierar ett nytt GUI. public class extends Frame private gui; // För att körningen skall starta. Instansierar denna klass. public static void main(string[] args) program = new (); // Konstruktor som skapar ett nytt GUI och skickar med en // referens till detta objekt, vilket betyder att detta objekt // kommer att refereras till av variabeln "program" i de båda // andra klasserna. public () gui = new (this); // Metod som anropas av lyssnaren när en event inträffat. public void updatelabel() gui.updatelabel(gui.getquote()); System.out.println("Updating label"); 2/11-00 Datakommunikation - Jonny Pettersson, UmU 4.java import java.awt.*; // Denna klass ritar upp själva gränssnittet och sätter // upp lyssnare för olika komponenter public class private program; private listener; private Panel buttonpanel = new Panel(); private Button okbutton = new Button("OK"); private Button quitbutton = new Button("Quit"); private Label infolabel = new Label("Enter a text in the field below and press OK"); private Label textlabel = new Label("Nothing entered"); private TextField inputfield = new TextField(50); // Konstruktorn. Tar det anropande programmet som parameter public ( callingprogram) program = callingprogram; // Skapa en ny lyssnare listener = new (program); 2/11-00 Datakommunikation - Jonny Pettersson, UmU 5.java (forts) // Tala om vad de olika knapparna skall ha för ID och // addera lyssnare till dessa okbutton.setactioncommand("ok"); okbutton.addactionlistener(listener); quitbutton.setactioncommand("quit"); quitbutton.addactionlistener(listener); // Programmet får ett rutsystem med 4 rader och 1 kolumn // att placera komponenter i program.setlayout(new GridLayout(4,1)); // Lägg till de olika komponenterna program.add(infolabel); program.add(inputfield); program.add(textlabel); // Lägg till de två knapparna i en panel, för att få dem // bredvid varandra. Lägg sedan till panelen i den sista // "rutan" i programmet buttonpanel.add(okbutton); buttonpanel.add(quitbutton); program.add(buttonpanel); // Sätt en defaultstorlek program.setsize(300,200); // Gör programmet synligt program.setvisible(true); 2/11-00 Datakommunikation - Jonny Pettersson, UmU 6
.java (forts).java import java.awt.event.*; // För att sätta ny text i textlabeln public void updatelabel(string newtext) textlabel.settext(newtext); // För att hämta texten från inmatningsfältet public String getquote() return inputfield.gettext(); 2/11-00 Datakommunikation - Jonny Pettersson, UmU 7 // Denna klass lyssnar på de två knapparna i GUIet och // rapporterar till huvudprogrammet när knapparna tryckts in. public class implements ActionListener private program; // Konstruktor. // Tar referens till huvudprogrammet som argument // för att veta var rapport om händelser skall skickas. public ( listeningprogram) program = listeningprogram; // Metod som körs när en ActionEvent inträffat. // Tar reda på vilket ID händelsen har och utför därefter rätt saker. // Dessa IDn sattes med metoden setactioncommand i GUIet. public void actionperformed(actionevent event) String happened = event.getactioncommand(); if(happened.equals("ok")) // OK-knapp intryckt program.updatelabel(); else // Quit-knapp intryckt program.setvisible(false); // Ta bort GUI program.dispose(); // Frigör resurser System.exit(0); // Avsluta 2/11-00 Datakommunikation - Jonny Pettersson, UmU 8 UDP UDPClient.java Server serversocket = DatagramSocket() Läs från serversocket Skriv svar till serversocket Klient = DatagramSocket() Skapa adress och skicka datagram på Läs svar på Stäng class UDPClient public static void main (String argv[]) throws Exception // Skapa ström för att läsa från tangentbordet BufferedReader infromuser = new BufferedReader(new InputStreamReader(System.in)); // DatagramSocket = new DatagramSocket(); // Skapa IP-adress InetAddress IPAddress = InetAddress.getByName("emil"); // Läs in från tangentbordet byte[] senddata = new byte[1024]; byte[] receivedata = new byte[1024]; String sentence = infromuser.readline(); senddata = sentence.getbytes(); 2/11-00 Datakommunikation - Jonny Pettersson, UmU 9 2/11-00 Datakommunikation - Jonny Pettersson, UmU 10 UDPClient.java (forts) UDPServer.java // Skapa datagram med sänddata och sänd det DatagramPacket sendpacket = new DatagramPacket(sendData, senddata.length, IPAddress, 3456);.send(sendPacket); // Skapa datagram för att motta data och ta // emot data DatagramPacket receivepacket = new DatagramPacket(receiveData, receivedata.length);.receive(receivepacket); // Ta ut det erhålla datat ur paketet och // skriv ut det String modifiedsentence = new String(receivePacket.getData()); System.out.println("FROM SERVER: " + modifiedsentence); // Stäng socketen.close(); class UDPServer public static void main(string argv[]) throws Exception // DatagramSocket serversocket = new DatagramSocket(3456); byte[] senddata = new byte[1024]; byte[] receivedata = new byte[1024]; while(true) // Skapa paket och ta emot data DatagramPacket receivepacket = new DatagramPacket(receiveData, receivedata.length); serversocket.receive(receivepacket); String sentence = new String(receivePacket.getData()); 2/11-00 Datakommunikation - Jonny Pettersson, UmU 11 2/11-00 Datakommunikation - Jonny Pettersson, UmU 12
UDPServer.java (forts) // Ta reda på IP-adress och port för klienten InetAddress IPAddress = receivepacket.getaddress(); int port = receivepacket.getport(); // Behandla data, skapa paket och skicka det String capitalizedsentence = sentence.touppercase(); senddata = capitalizedsentence.getbytes(); DatagramPacket sendpacket = new DatagramPacket(sendData, senddata.length, IPAddress, port); serversocket.send(sendpacket); Server welcomesocket = ServerSocket() Vänta på uppkoppling connectionsocket = welcomesocket.accept() Läs från connectionsocket uppkoppling Klient och koppla upp mot servern = Socket() Skicka på Skriv svar till connectionsocket Läs svar på Stäng connectionsocket Stäng 2/11-00 Datakommunikation - Jonny Pettersson, UmU 13 2/11-00 Datakommunikation - Jonny Pettersson, UmU 14 Client.java Client.java (forts) // Skapa ström för att läsa från servern BufferedReader infromserver = new BufferedReader( new InputStreamReader(.getInputStream())); class Client public static void main (String argv[]) throws Exception String sentence; String modifiedsentence; // Skapa ström för att läsa från tangentbordet BufferedReader infromuser = new BufferedReader(new InputStreamReader(System.in)); // Socket = new Socket("emil", 3456); // Läs in rad från tangentbordet och skriv till servern sentence = infromuser.readline(); outtoserver.writebytes(sentence + '\n'); // Läs in från servern och skriv ut på skärmen modifiedsentence = infromserver.readline(); System.out.println("FROM SERVER: " + modifiedsentence); // Stäng socketen.close(); // Skapa ström för att skriva till servern DataOutputStream outtoserver = new DataOutputStream(.getOutputStream()); 2/11-00 Datakommunikation - Jonny Pettersson, UmU 15 2/11-00 Datakommunikation - Jonny Pettersson, UmU 16 Server.java Server.java (forts) // Skapa ström för att skriva till klienten DataOutputStream outtoclient = new DataOutputStream( connectionsocket.getoutputstream()); class Server public static void main(string argv[]) throws Exception String clientsentence; String capitalizedsentence; // Skapa serversocket ServerSocket welcomesocket = new ServerSocket(3456); // Läs in från klienten, omvandla och skicka tillbaka clientsentence = infromclient.readline(); capitalizedsentence = clientsentence.touppercase() + '\n'; outtoclient.writebytes(capitalizedsentence); while(true) // Acceptera uppkoppling Socket connectionsocket = welcomesocket.accept(); // Skapa ström för att läsa från klienten BufferedReader infromclient = new BufferedReader( new InputStreamReader(connectionSocket.getInputStream())); 2/11-00 Datakommunikation - Jonny Pettersson, UmU 17 2/11-00 Datakommunikation - Jonny Pettersson, UmU 18
Trådar i Java Laboration 2 public class Threadexampel public static void main(string[] args) throws java.io.ioexception System.out.println("Starting 5 threads..."); for (int i = 0 ; i < 5 ; i++) new ExampelThread(i).start(); System.out.println("5 threads started"); Chatklient (client) Chatserver Chatklient (client) public class ExampelThread extends Thread comp comp private int i; crypt (server) crypt public ExampelThread(int i) super("exampelthread"); this.i = i; public void run() System.out.println("Hallo from thread " + i); Physical links 2/11-00 Datakommunikation - Jonny Pettersson, UmU 19 2/11-00 Datakommunikation - Jonny Pettersson, UmU 20 Laboration 2 Nameserver From nameserver: ACK From nameserver: NOTREG From client: GETLIST From chatserver: ALIVE To client: LIST From chatserver: REG From client: GETMESSAGES Chatserver Chatclient MESSAGE QUIT Tips Trådar Trådsäkra funktioner Minnesläcka vid trådanvändning nanosleep() för balans Mutex Stäng alltid fildescriptorer Lås upp lås innan krasch Felhantering 2/11-00 Datakommunikation - Jonny Pettersson, UmU 21 2/11-00 Datakommunikation - Jonny Pettersson, UmU 22 Felhantering 1 Felhantering 2 #include <stdio.h> #include <stdarg.h> void lprintf(const char *fmt,...) va_list args; va_start(args, fmt); fprintf(stderr, "LOG: "); vfprintf(stderr, fmt, args); va_end(args); int main() lprintf("hej %d %s\n", 3, "små grisar"); #define DBUG #ifdef DBUG #define skriv(x, args...) fprintf(stderr, x, ##args); #else #define skriv(args...) ; #endif skriv("hej igen %d %s\n", 3, "små grisar"); return 0; 2/11-00 Datakommunikation - Jonny Pettersson, UmU 23 2/11-00 Datakommunikation - Jonny Pettersson, UmU 24
Tips (forts) Globala variabler och konstanter Dynamiska lösningar Make it work - make it fast Testning Använd C-biblioteket 2/11-00 Datakommunikation - Jonny Pettersson, UmU 25