1 Netværksprogrammering 2 Plan Socket-baseret kommunikation Fjernmetodekald (RMI) - Designmønsteret Proxy Databasetilgang (JDBC)

Slides:



Advertisements
Lignende præsentationer
SPBG.  Test driven development  Unit test frameworks  MOSS TDD  Mocking  Design patterns.
Advertisements

v/ Professor Lars Ehlers, Aalborg Universitet
Drupal[.org] Open Source CMS 6/
C#: Data Typer. Indhold: “.NET is designed around the CTS, or Common Type System. The CTS is what allows assemblies, written in different languages, to.
RT Speciale Evaluering af Java til udvikling af indlejrede realtidssystemer ved brug af en eksisterende ”Java Optimized Processor” (JOP) Speciale – efterår.
Distribueret programmering, specielt Web Services Rasmus D. Lehrmann DM
T1 – OPGAVE 14.2 LINETT & SABRINA Klasse Varer namespace Opgave_14._2 { class Varer { private string vare; private string farve; private double.
SQL 1 DDL og DML.
Array og ArrayList Et slideshow. Som er sødt.. Hvordan virker ArrayList?  ArrayList NAVN = new ArrayList ();  NAVN.add(”Værdi”);  NAVN.add(index, ”værdi”)
13 – Database med JDBC. 2 NOEA2009Java-kursus – JDBC JDBC JDBC er et standard bibliotek til at tilgå relational databaser API’et er en standardiseret.
Arkitektur Embedded SQL Tema Persistens
1 JavaServer Faces Copyright © Lund & Bendsen Dynamikken i JSF.
Indledende Programmering Uge 2 - Efterår 2006 Selektioner og interaktion mellem objekter Susanne Brix Lindros.
C#: Udtryk og metoder. Indhold “With regards to programming statements and methods, C# offers what you would come to expect from a modern OOPL…” Udtryk.
Datastrukturer og Collections Oversigt og forskel imellem Jave og.net Collections library Collection interfaces ArrayList IList interface Hashtable Hashtable.
SQL - Database Lektion 3 7. Semester.
06 – Java Packages Packages og ClassPath. 2 NOEA2009Java-kursus – Packages og class path Hvad er Packages? En package er en gruppering af relaterede typer.
Item gennemgang  Item: 01 – Static factory methods  Item: 09 – Override hashCode  Item: 17 – Design & document inheritence  Item: 25 – Lists over arrays.
Distribueret programmering, specielt.NET Remoting Rasmus D. Lehrmann DM
Collectionklasser Klassifikation og anvendelse. Collections Motivation –hvorfor bruge collections? Realisering af en-til-mange relationer –Importer, erklær,
1 Parsing. 2 Mål: Et program til indlæsning og beregning af aritmetiske udtryk Eksempel: Beregn (3*5 + 4/2) - 1 Løs et lettere problem først: Læs en streng.
Per P Madsen AAU1 Del 3 : Transportlaget - Protokoller. UDP. TCP - Pålidelig kommunikation og PAR-princippet - Wireless TCP - Socket-API’en.
View Procedures Trigger og Function Jesper Tørresø DAB1 E07 1. november 2007.
CodeIgniter Database Brugerinput Form Validation 20101JFH.
Objekter og klasser Applikationsdesign Code Namespace Value og reference typer Reference type Rasmus D. Lehrmann1.
FEN Databaser/DBAdgang21 DB-adgang - Connectionless Connectionless DataAdapter DataSet.
12 – GUI med Swing. 2 NOEA2009Java-kursus – GUI med Swing Designer view Komponenter Frame Properties Inspector.
Hvordan man skriver koden.
01 – Java platform for starters. 2 NOEA2009Java-kursus – Java Platform Introduktion til Java Baggrund Hvad er Java? Faciliteter i Java.
Introduktion til.NET- platformen og version 2.0 Michell Cronberg Microsoft MVP
Distribution af funktionalitet Webservice med WCF x.
Distribution af funktionalitet Webservice med WCF x.
ASP.NET Custom Web Controls Deployment. Agenda – ASP.NET Web User Controls Composite Control Rendered Custom Control Deploy en Web Applikation.
HUSKESPIL – den lille tabel
Titel: Arial, fed, skriftstr. 20, mørkegrå. Tekst: Arial, normal, fed eller kursiv, skriftstr. 10, 12 og 14 til print – 16 og 18 til projektor – mørkegrå.
Relativ vigtighed for elektroniske ressourcer,24,22,20,18,16,14,12,10 Indeks FARM nem at bruge Info om anvendelse af elektroniske.
VPG/Otto Knudsen1 VPR - Repetition Trådning Distribueret Programmering Sprogteori Grafer.
Abstrakte klasser og interfaces i Java
Programering af mobile enheder Windows Phone Storage.
Begreber og Redskaber 9. Plan for idag I dag: Datastrukturer Tabeller Lister, mængder, maps, grafer Hægtede lister.
N-lags design/Otto Knudsen 1 N-lags Design Definition Motivation.
Session Når man hoster en WCF Service på ASP.NET website, kan man bruge ASP.NET’s Session.
22/092VE/E00/RB1 Introduktion til SQL Datalogi 2VE E00 DIKU Forelæsninger 22/9 og 29/9.
Gruppe sort Morten, Peter, Jesper, Spencer & Støving.
Begreber og Redskaber 5. Collections i Java 1.2 Framework: samling af datastrukturer og algoritmer som generelt værktøj. En ramme til at arbejde med søgning.
2009NOEA/IT - Databaser/SQL1 Realisering af den relationelle model i SQL-baserede DBMS’er SQL er mere end forespørgsler - det omfatter bl.a. –DDL Data.
Begreber og Redskaber 5. Plan for idag Overblik over klasser,objekter,nedarvning –Repetition fra Dat A/Indledende programmering –Centrale begreber om.
J2EE Java Server Pages (JSP) Avanceret Internetteknologi 2 (ITNET2)
Begreber og Redskaber 2. Plan for idag Noget om bestanddelene i et programmeringssprog Syntaksbeskrivelse af java Næste gang: –Binære tal –Repræsentation.
Matematik B 1.
AJAX/Otto Knudsen 1 AJAX Motivation Definition. AJAX/Otto Knudsen 2 Motivation En typisk web-applikation er synkron klienten sender en forespørgsel og.
1 Tråde 2 Plan Trådbegrebet Synkronisering Koordinering Eksempel: et flertrådet spil.
Fundamentale datastrukturer
1 Fundamentale datastrukturer. 2 Definitioner: abstrakt datatype, datastruktur Elementære datastrukturer og abstrakte datatyper : arrays, stakke, køer,
1 Kursusafslutning. 2 Plan Opgaveseminar Kursusevaluering.
8 RÅD VEDRØRENDE GOD PROGRAMMERING Effective (brown) Java.
11 - Exceptions. 2 NOEA2009Java-kursus – Exceptions Hvad er en exception? En undtagelse. Typisk en fejl der opstår runtime Afbryder det normale programflow.
ADO.NET Databaser SQL Client (SQL server 7 og senere) OleDb (en række incl. jet) ODBC MySql (ekstra driver skal instaleres) Oracle (XML dataset) Samme.
Uge 14: distribuerede objekter, fjernprocedurekald, RMI Tirsdag: Introduktion Mulige fordele ved distribuerede objekter Introduktion til RMI: - Interfacets.
8.5 JDBC1 JDBC 8.5 Java Database Connectivity. 8.5 JDBC2 JDBC introduktion, 393 JDBC er ikke en forkortelse for –Java Database Connectivity Sun har defineret.
03 – Udtryk og metoder. 2 NOEA2009Java-kursus – Udtryk og metoder Udtryk i Java Java har standard udtrykene… Værditildeling Subrutiner og funktionskald.
Hvad består en distribueret applikation af ? Processer der kører på hver deres maskine Tråde - 1 eller flere "letvægtsprocesser" per proces Objekter i.
Databaseadgang fra C#:
Længste plateau En klassisk problemstilling (Gries, 1981) - og her i Java!!! Denne opgave drejer sig om at bestemme længden af det længste plateau i en.
9. Interfaces. 2 Nordjyllands Erhvervakademi Objectives “Good class design starts with good application design — how many classes, do they relate.
Identitet vs lighed. Spørgsmål Hvad udskriver run metoden? 1.”Ens!” 2.”Forskellige!” 3.Ved ikke public class Driver{ public static void run(){ String.
Paradigmer i Programmering 3. Højere ordens funktioner Idag: Højere ordens funktioner Algebraiske datatyper Næste gang: I/O, Filer, interaktive programmer.
Begreber og Redskaber 4. Plan for idag Om metoder, parametre, returværdier Et par ord om objekt-orientering Håndkøring af programmer.
Begreber og Redskaber 3. Plan for idag Om metoder, parametre, returværdier Overblik over klasser,objekter,nedarvning Et par ord om objekt-orientering.
DAIMIIntroducerende objektorienteret programmering3B.1 Definition af klasser Klasseskelet, metoder, et eksempel: dato.
Præsentationens transcript:

1 Netværksprogrammering

2 Plan Socket-baseret kommunikation Fjernmetodekald (RMI) - Designmønsteret Proxy Databasetilgang (JDBC)

3 Dagens beregningsmiljøer er distribuerede: beregningerne forgår på flere værtsmaskiner heterogene:værtsmaskinerne er forskellige Distribuerede beregninger

4 Java indeholder to mekanismer til distribuerede beregninger: (1) Socket-baseret kommunikation( java.net ) En “socket” er et endepunkt for en tovejs-forbindelse imellem to parter. (2)Fjernmetodekald (RMI)( java.rmi ) RMI tillader manipulation af objekter på fjerne maskiner, som om objekterne var lokale. Kommunikation

5 Sockets er endepunkterne for en tovejs-forbindelse imellem to værtsmaskiner. Der er to slags sockets: server sockets og client sockets. En server socket venter på klienters anmodning om en forbindelse. En client socket (også blot kaldet socket) bruges til både at sende og modtage data. Socket-baseret kommunikation

6 En server socket lytter på en bestemt port. En port er angivet ved et positivt heltal mindre end eller lig med Portnummeret er nødvendigt for at kunne skelne imellem servere (server-applikationer), der kører på samme værtsmaskine. De første 1024 porte er reserveret til specifikke protokoller, f.eks. 21 til FTP, 23 til Telnet, 25 til og 80 til HTTP. Porte

7 En server socket er en instans af klassen ServerSocket og skabes ved en af følgende to konstruktører: ServerSocket(int port) ServerSocket(int port, int backlog) port : portnummeret backlog : den maksimale længde for køen af ventende klienter (50 er standard) Kun applikationer kan skabe ServerSocket -objekter. Server sockets

8 Socket accept() Vent på en anmodning om en forbindelse fra en klient. Den tråd, der udfører kaldet, blokeres, indtil der modtages en anmodning om forbindelse. Når det sker, returnerer accept med et Socket -objekt. void close() Luk denne ServerSocket. Metoder i ServerSocket

9 try { ServerSocket s = new ServerSocket(port); while (true) { Socket incoming = s.accept(); «Handle a client» incoming.close(); } s.close(); } catch (IOException e) { «Handle exception» } Typisk brug af ServerSocket

10 Client sockets En client socket er en instans af klassen Socket og kan opnås på to måder: (1) På serversiden som returværdi af accept(). (2) På klientsiden ved brug af konstruktøren Socket(String host, int port) host : navnet på værtsmaskinen port : portnummeret

11 Klienters kommunikation med en server Client Socket Client Socket new Socket(...) ServerSocket Server-applikation Socket ServerSocket Kommunikationen håndteres på begge sider med Socket -objekter.

12 getInputStream() Returnerer et InputStream -objekt til modtagelse af data getOutputStream() Returnerer et OutputStream -objekt til afsendelse af data close() Lukker forbindelsen Metoder i Socket

13 try { Socket socket = new Socket(host, port); BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream())); PrintWriter out = new PrintWriter( new OutputStreamWriter( socket.getOutputStream())); «Send and receive data» in.close(); out.close(); socket.close(); } catch (IOException e) { «Handle exception» } Typisk brug af Socket

14 Udvikling af client/server- programmer 1.Afgør, om det er fornuftigt at implementere en server og en eller flere matchende klienter 2.Design en (tekstbaseret) kommunikationsprotokol 3.Implementér serveren 4.Afprøv serveren med et telnetprogram 1.Programmér og afprøv en klient

15 import java.io.*; import java.net.*; public class EchoServer { public static void main(String[] args) { try { ServerSocket s = new ServerSocket(8008); while (true) { Socket incoming = s.accept(); BufferedReader in = new BufferedReader( new InputStreamReader( incoming.getInputStream())); PrintWriter out = new PrintWriter( new OutputStreamWriter( incoming.getOutputStream())); En simpel ekko-server fortsættes

16 out.println("Hello! This is the Java EchoServer."); out.println("Enter BYE to exit."); out.flush(); while (true) { String str = in.readLine(); if (str == null) break; // client closed connection out.println("Echo: " + str); out.flush(); if (str.trim().equals("BYE")) break; } in.close(); out.close(); incoming.close(); } } catch (Exception e) {} } }

17 Kørsel med et telnetprogram som klient venus% telnet saturn 8008 Trying Connected to saturn. Escape character is '^]'. Hello! This is the Java EchoServer. Enter BYE to exit. Hi, this is from venus Echo: Hi, this is from venus BYE Echo: BYE Connection closed by foreign host. Telnet: Et terminalemuleringsprogram til TCP/IP-netværk såsom Internettet

18 En simpel Java-klient til ekko-serveren import java.io.*; import java.net.*; public class EchoClient { public static void main(String[] args) { try { String host = args.length > 0 ? args[0] : "localhost"; Socket socket = new Socket(host, 8008); BufferedReader in = new BufferedReader( new InputStreamReader( socket.getInputStream())); PrintWriter out = new PrintWriter( new OutputStreamWriter( socket.getOutputStream())); fortsættes

19 // send data to the server for (int i = 1; i <= 10; i++) { System.out.println("Sending: line " + i); out.println("line " + i); out.flush(); } out.println("BYE"); out.flush(); // receive data from the server while (true) { String str = in.readLine(); if (str == null) break; System.out.println(str); } in.close(); out.close(); socket.close(); } catch (Exception e) {} }

20 Kørsel med Java-klienten venus% java EchoClient saturn Sending: line 1 Sending: line 2... Sending: line 10 Hello! This is Java EchoServer. Enter BYE to exit. Echo: line 1 Echo: line 2... Echo: line 10 Echo: BYE

21 En ekko-server, der servicerer flere klienter samtidigt public class MultiEchoServer { public static void main(String[] args) { try { ServerSocket s = new ServerSocket(8009); while (true) { Socket incoming = s.accept(); new ClientHandler(incoming).start(); } } catch (Exception e) {} } Benyt en tråd for hver af klienterne.

22 Klassen ClientHandler public class ClientHandler extends Thread { protected Socket incoming; public ClientHandler(Socket incoming) { this.incoming = incoming; } public void run() { try { BufferedReader in = new BufferedReader( new InputStreamReader( incoming.getInputStream())); PrintWriter out = new PrintWriter( new OutputStreamWriter( incoming.getOutputStream())); fortsættes

23 out.println("Hello!..."); out.println("Enter BYE to exit."); out.flush(); while (true) { String str = in.readLine(); if (str == null) break; out.println("Echo: " + str); out.flush(); if (str.trim().equals("BYE")) break; } in.close(); out.close(); incoming.close(); } catch (Exception e) {} }

24 Rundsending af meddelelser til flere klienter Udvikling af en chat-server, der håndterer flere klienter samtidigt rundsender en meddelelse, der modtages fra en klient til alle andre klienter Der er behov for at holde rede på alle aktive klienter.

25 Chat

26 ChatServer public class ChatServer { public ChatServer(int port) throws IOException { ServerSocket s = new ServerSocket(port); while (true) new ChatHandler(s.accept()).start(); } public static void main(String[] args) throws IOException { if (args.length != 1) throw new RuntimeException( "Syntax: java ChatServer "); new ChatServer(Integer.parseInt(args[0])); } }

27 public class ChatHandler extends Thread { Socket socket; DataInputStream in; DataOutputStream out; static Set handlers = new HashSet (); public ChatHandler(Socket socket) throws IOException { this.socket = socket; in = new DataInputStream(socket.getInputStream()); out = new DataOutputStream(socket.getOutputStream()); handlers.add(this); } ChatHandler fortsættes

28 public void run() { String name = ""; try { name = in.readUTF(); System.out.println("New client " + name + " from " + socket.getInetAddress()); broadcast(name + " entered"); while(true) broadcast(name + ": " + in.readUTF()); } catch (IOException e) { System.out.println("-- Connection to user lost."); } finally { handlers.remove(this); try { broadcast(name + " left"); in.close(); out.close(); socket.close(); } catch (IOException e) {} } } fortsættes

29 static synchronized void broadcast(String message) throws IOException { for (ChatHandler handler : handlers) { handler.out.writeUTF(message); handler.out.flush(); } Bemærk, at metoden skal være synchronized.

30 ChatClient public class ChatClient { String name; Socket socket; DataInputStream in; DataOutputStream out; ChatFrame gui; public ChatClient(String name, String server, int port) { try { this.name = name; socket = new Socket(server, port); in = new DataInputStream(socket.getInputStream()); out = new DataOutputStream(socket.getOutputStream()); out.writeUTF(name); gui = new ChatFrame(this); while (true) gui.output.append(in.readUTF() + "\n"); } catch (IOException e) {} } fortsættes

31 void sendTextToChat(String str) { try { out.writeUTF(str); } catch (IOException e) { e.printStackTrace(); } } void disconnect() { try { in.close(); out.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) throws IOException { if (args.length != 3) throw new RuntimeException( "Syntax: java ChatClient "); new ChatClient(args[0], args[1], Integer.parseInt(args[2]); }

32 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class ChatFrame extends JFrame { JTextArea output = new JTextArea(); JTextField input = new JTextField(); public ChatFrame(final ChatClient client) { super(client.name); Container pane = getContentPane(); pane.setLayout(new BorderLayout()); pane.add(new JScrollPane(output), BorderLayout.CENTER); output.setEditable(false); pane.add(input, BorderLayout.SOUTH); fortsættes ChatFrame

33 input.addKeyListener(new KeyAdapter() { public void keyPressed(KeyEvent e) { if (e.getKeyCode() == KeyEvent.VK_ENTER) { client.sendTextToChat(input.getText()); input.setText(""); } }); setSize(400, 200); setVisible(true); input.requestFocus(); } addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { client.disconnect(); System.exit(0); } });

34 Fjernmetodekald RMI (Remote Method Invocation) Objekter på fjerne værtsmaskiner kan manipuleres, som om de befandt sig på den lokale maskine. server-vært server: void m() client: server.m() klient-vært server

35 Client: Et objekt på klient-værten Server: Et objekt på server-værten, der servicerer klienter Stub: Et objekt på klient-værten, der udgør en erstatning for Server-objektet Skeleton: Et objekt på server-værten, der modtager forespørgsler fra stubbe og videresender dem til Server- objektet Service contract: En grænseflade, der specificerer, hvilke tjenester, serveren kan yde RMI-arkitekturen ClientServer Stub JVM Skeleton JVM

36 RMI-kald Kald af server.m() i klienten: 1. Den tilsvarende stubmetode, stub.m(), kaldes 2.Stubben serialiserer argumenter og sender argumenter og kaldinformation til skelettet 3.Skelettet deserialiserer argumenter og kaldinformation, og kalder metoden m() i serveren 4.Serveren udfører metoden og returnerer resultatet til skelettet 5. Skelettet serialiserer resultatet og sender det til stubben 6.Stubben deserialiserer resultatet og returnerer det til klienten ClientServer Stub JVM Skeleton JVM

37 RMI-programmering Server, Client og Service contract skrives af programmøren. Stubbe og skeletter genereres af en RMI-oversætter (f.eks. rmic ) ud fra den oversatte Server -klasse.

38 Parameteroverførsel Ved et fjernmetodekald overføres lokale (nonremote) objekter ved værdi-overførsel (serialisering), medens fjerne (remote) objekter overføres ved reference-overførsel.

39 Enhver RMI-server identificeres ved en URL med protokollen rmi. rmi://host:port/name host : værtsnavn for RMI-kataloget (hvis udeladt: localhost ) port : portnummer for RMI-kataloget (hvis udeladt: 1099) name : navnet tilknyttet serveren RMI-registrering Serveren registreres på server-værten i et RMI-katalog. Denne proces kaldes binding: Naming.bind(name, server)

40 En klient kan lokalisere en RMI-server ved at slå op i RMI- kataloget: Opslag i RMI-kataloget Remote server = Naming.lookup(url)

41 Operationer på RMI-kataloget (statiske metoder i Naming ) static void bind(String name, Remote obj) static void rebind(String name, Remote obj) static void unbind(String name) static Remote lookup(String url) static String[] list(String url)

42 Anvendelse af RMI 1.Definer en grænseflade for Server-objektet. fortsættes public interface Contract extends Remote { public void aService(...) throws RemoteException; // other services } Denne udgør kontrakten imellem serveren og dens klienter. Grænsefladen skal udvide grænsefladen Remote. Hver af servicemetoderne skal erklæres, således at den kan kaste en RemoteException. Argumenternes typer skal være serialiserbare.

43 2.Definer en klasse, der implementerer kontrakten. Klassen skal nedarve fra klassen UnicastRemoteObject. public class ServiceProvider extends UnicastRemoteObject implements Contract { public void aService(...) throws RemoteException { // implementation } // implementation of other services } fortsættes

44 3.Skab en instans af serveren og registrer den i RMI- kataloget. Contract remoteObj = new ServiceProvider(...); Naming.rebind(name, remoteObj); fortsættes 4.Generer stub- og skelet-klasserne ved hjælp af RMI- oversætteren.

45 Contract serverObj = (Contract) Naming.lookup(url); //... serverObj.aService(...); //... fortsættes 5.Programmér en klient, der bruger de tjenester, som serveren udbyder. For at bruge et fjernt objekt, må klienten først lokalisere objektet ved hjælp af RMI-kataloget.

46 Struktur af RMI-applikationer aService() ContractAClient Remote ServiceProvider_Stub aService() ServiceProvider aService() UnicastRemoteObject

47 Designmønsteret Proxy Kategori: Strukturelt designmønster Hensigt: At tilbyde en erstatning for et andet objekt. Anvendelse: Når der er brug for en mere raffineret reference til et objekt end en simpel reference

48 Designmønsteret Proxy (fortsat) Struktur: Client RealObjectProxy Subject

49 Designmønsteret Proxy (fortsat) Deltagere: Proxy (f.eks. ServiceProvider_Stub ), der har en reference, der kan bruges til at referere det virkelige objekt, og som implementerer Subject- grænsefladen Subject (f.eks. Contract ), der definerer en fælles grænseflade for Subject og Proxy, således at Proxy kan bruges overalt, hvor Subject forventes RealObject (f.eks. ServiceProvider ), der definerer det virkelige objekt, som Proxy repræsenterer

50 Udvikling af et RMI-baseret chat-system Fjernmetodekald på både server- og klientside. Server: login logout sendMessage Client: receiveLogin receiveLogout receiveMessage

51 public interface ChatServerInterface extends Remote { public void login(String name, ChatClientInterface newClient) throws RemoteException; public void logout(String name) throws RemoteException; public void sendMessage(Message message) throws RemoteException; } public interface ChatClientInterface extends Remote { public void receiveLogin(String name) throws RemoteException; public void receiveLogout(String name) throws RemoteException; public void receiveMessage(Message message) throws RemoteException; } Grænseflader

52 Message public class Message implements java.io.Serializable { public String name, text; public Message(String name, String text) { this.name = name; this.text = text; }

53 import java.rmi.*; import java.rmi.server.*; import java.rmi.registry.*; import java.util.*; public class ChatServer extends UnicastRemoteObject implements ChatServerInterface { Map chatters = new HashMap (); public ChatServer() throws RemoteException {} public synchronized void login(String name, ChatClientInterface newClient) throws RemoteException { chatters.put(name, newClient); for (ChatClientInterface client : chatters.values()) client.receiveLogin(name); } ChatServer fortsættes

54 public synchronized void logout(String name) throws RemoteException { chatters.remove(name); for (ChatClientInterface client : chatters.values()) client.receiveLogout(name); System.out.println("client " + name + " logged out"); } public synchronized void sendMessage(Message message) throws RemoteException { for (ChatClientInterface client : chatters.values()) client.receiveMessage(message); } public static void main(String[] args) { try { LocateRegistry.createRegistry(1099); Naming.rebind("ChatServer", new ChatServer()); } catch (Exception e) { e.printStackTrace(); } }

55 public class ChatClient extends UnicastRemoteObject implements ChatClientInterface { String name; ChatServerInterface server; ChatFrame gui; public ChatClient(String name, String url) throws RemoteException { this.name = name; try { server = (ChatServerInterface) java.rmi.Naming.lookup("rmi://" + url + "/ChatServer"); server.login(name, this); } catch (Exception e) { e.printStackTrace(); } gui = new ChatFrame(this); } ChatClient fortsættes

56 public void receiveLogin(String name) { gui.output.append(name + " entered\n"); } public void receiveLogout(String name) { gui.output.append(name + " left\n"); } public void receiveMessage(Message message) { gui.output.append(message.name + ": " + message.text + "\n"); } fortsættes

57 void sendTextToChat(String text) { try { server.sendMessage(new Message(name, text)); } catch (RemoteException e) { e.printStackTrace(); } } void disconnect() { try { server.logout(name); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { if (args.length != 2) throw new RuntimeException( "Usage: java ChatClient "); try { new ChatClient(args[0], args[1]); } catch (RemoteException e) { e.printStackTrace(); } }

58 Børsnoteringer Studér lærebogens design af client/server-programmel til løbende underretning om aktiekurser. Client pull: Klienterne kontakter serveren med passende mellemrum for at få oplyst de aktuelle kurser Client push: Serveren underretter interesserede klienter, når kurserne ændres Socket-baserede udgaver: s RMI-baserede udgaver: s

59 JDBC Java Database Connectivity JDBC er en API, der tillader et Java-program at tilgå relationelle databaser. JDBC tilbyder en simpel grænseflade til SQL (Structured Query Language). Muliggør: skabelse af en database indsættelse, søgning og opdatering tilgang til metadata

60 Eksempel på en database name address city state zip creditcard orderno M. Jordan 549 E. Surf Chicago IL Visa S. Pippen 11 S. 59th Oakbrook IL Discover D. Rodman 234 N. 3rd Chicago IL MasterCard S. Kerr 4010 Pine Los Angeles CA Visa R. Harper 234 N. 3rd New York NY MasterCard

61 Basale SQL-kommandoer INSERT Indsætter en eller flere nye rækker i en tabel DELETE Sletter en eller flere rækker i en tabel UPDATE Modificerer værdierne i en eller flere rækker i en tabel SELECT Udvælger information baseret på en betingelse CREATE Skaber et nyt databaseobjekt DROP Fjerner et eksisterende databaseobjekt ALTER Ændrer formatet for et eksisterende databaseobjekt

62 JDBC-drivere En driver udgør bindeledet imellem program og database. Der er fire typer: (1) JDBC-ODBC-bro: -> ODBC (Open Data Base Connectivity) (2) Native-API (delvis Java): -> DBMS (3) Net-protocol (ren Java): -> netprotokol -> DBMS (4) Native-protocol (ren Java):-> DBMS’ netprotokol

63 Ikke-kommercielle JDBC-drivere (open source type 4 drivere) Cloudscape MySQL PostgreSQL

64 Application JDBC-interaktion JDBC-ODBC Bridge ODBC Driver Sybase DriverODBC Driver Oracle Database ODBC Database Sybase Database DriverManager Class.forName Connection getConnection Statement createStatement ResultSet executeUpdateexecuteQuery PreparedStatement ResultSet prepareStatement executeUpdateexecuteQuery CallableStatement ResultSet prepareCall execute

65 Skabelse af en JDBC-tabel import java.sql.*; import java.io.*; public class BuildBeetlesTable { public static void main(String args[]) throws SQLException, IOException { System.out.println("Loading JDBC driver..."); try { Class.forName("com.mysql.jdbc.Driver"); } catch(ClassNotFoundException e) { System.exit(1); } fortsættes 1. Driveren hentes

66 System.out.println("Connecting to Orders database..."); String url = "jdbc:mysql://localhost/OrdersDriver"; String user = "keld"; String password = "xyz123"; Connection conn = DriverManager.getConnection(url, user, password); conn.setAutoCommit(false); fortsættes 2. Forbindelse til database etableres

67 System.out.print("Building new Beetles table...\n\n"); Statement stmt = conn.createStatement(); String createString = "CREATE TABLE Beetles (name VARCHAR(35), " + "address VARCHAR(35), " + "city VARCHAR(20), " + "state VARCHAR(2), " + "zip VARCHAR(5), " + " VARCHAR(30), " + "creditCard VARCHAR(15))"; stmt.executeUpdate(createString); 3. En tabel skabes fortsættes

68 System.out.print("Inserting test row in Beetles table...\n\n"); String insertString = "INSERT INTO Beetles VALUES ('Michael Owen', " + "'123 Elmwood Street', " + "'Lake Forest', " + "'IL', " + "'65431', " + " + "'MasterCard')"; stmt.executeUpdate(insertString); 4. En række indsættes fortsættes

69 ResultSet rset = stmt.executeQuery("SELECT * FROM Beetles"); while (rset.next()) { System.out.print(" "); System.out.print(rset.getString("name") + ", "); System.out.print(rset.getString(2) + ", " ); System.out.print(rset.getString(3) + ", " ); System.out.print(rset.getString(4) + ",\n "); System.out.print(rset.getString(5) + ", "); System.out.print(rset.getString(6) + ", "); System.out.print(rset.getString(7) + "\n"); } 5. Tabellens indhold udskrives fortsættes

70 System.out.println("Closing database connection..."); conn.commit(); // make changes permanent stmt.close(); rset.close(); conn.close(); // release DBMS ressources } 6. Ressourcer frigives, og forbindelsen til databasen lukkes

71 Modifikation af en JDBC-tabel import java.sql.*; import java.io.*; import java.util.Calendar; public class ModifyBeetlesTable { public static void main(String args[]) throws SQLException, IOException { System.out.println("Loading JDBC driver..."); try { Class.forName("com.mysql.jdbc.Driver"); } catch(ClassNotFoundException e) { System.exit(1); } fortsættes 1. Driveren hentes

72 System.out.println("Connecting to Beetles table..."); String url = "jdbc:mysql://localhost/OrdersDriver" + "?user=keld&password=xyz123"; Connection conn = DriverManager.getConnection(url); conn.setAutoCommit(false); fortsættes 2. Forbindelse til database etableres

73 3. Der tilføjes et ekstra felt (søjle) stmt = conn.createStatement(); System.out.print("Modifying Beetles table...\n\n"); String updateString = "ALTER TABLE Beetles ADD ORDERNO VARCHAR(12)”; stmt.executeUpdate(updateString); fortsættes

74 Calendar cal = Calendar.getInstance(); String orderNo = String.valueOf(cal.get(cal.MONTH) + 1) + String.valueOf(cal.get(cal.DAY_OF_MONTH)) + String.valueOf(cal.get(cal.YEAR)) + String.valueOf(cal.get(cal.HOUR)) + String.valueOf(cal.get(cal.MINUTE)) + String.valueOf(cal.get(cal.SECOND)); updateString = "UPDATE Beetles SET ORDERNO = " + orderNo + " WHERE NAME='Michael Owen'"; stmt.executeUpdate(updateString); 4. En række i tabellen opdateres fortsættes

75 5. Tabellens indhold udskrives System.out.print("Displaying table contents...\n\n"); ResultSet rset = stmt.executeQuery("SELECT * FROM Beetles"); while (rset.next()) { System.out.println(" " + rset.getString("name") + ", " + rset.getString("address") + ", " + rset.getString("city") + ", " + rset.getString("state") + "\n " + rset.getString("zip") + ", " + rset.getString(" ") + ", " + rset.getString("creditCard") + ", " + rset.getString("orderno") ); } fortsættes

76 6. En række slettes System.out.println("Deleting test record..."); updateString = "DELETE FROM Beetles WHERE NAME='Michael Owen'"; stmt.executeUpdate(updateString); fortsættes

77 System.out.println("Closing database connection..."); conn.commit(); stmt.close(); rset.close(); conn.close(); } 7. Ressourcer frigives, og forbindelsen til databasen lukkes

78 E-handel med en ordre-database import java.util.Calendar; import java.awt.event.*; import javax.swing.*; import java.sql.*; import java.io.*; public class JdbcOrderDialog extends OrderDialog { public JdbcOrderDialog(JFrame owner) { super(owner); } protected ActionListener makeButtonHandler() { return new JdbcButtonHandler(); } class JdbcButtonHandler implements ActionListener {... } } fortsættes

79 class JdbcButtonHandler implements ActionListener { public void actionPerformed(ActionEvent evt) { JButton button = (JButton) evt.getSource(); String label = button.getText(); if (label.equals("Ok") { try { insertNewOrder(); } catch (IOException IOex) {} dialogPanel.reset(); setVisible(false); } public void insertNewOrder() throws SQLException, IOException {... } } fortsættes

80 public void insertNewOrder() throws SQLException, IOException { System.out.print("Loading JDBC driver...\n\n\n" ); try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { System.exit(0); } String url = "jdbc:mysql://localhost/OrdersDriver" + "?user=keld&password=xyz123"; Connection conn = DriverManager.getConnection(url); Statement stmt = conn.createStatement(); String creditCard = null; if (dialogPanel.visaBox.isSelected()) creditCard = "Visa"; else if (dialogPanel.mcBox.isSelected()) creditCard = "MasterCard"; else if (dialogPanel.discoverBox.isSelected()) creditCard = "Discover"; //... fortsættes

81 Calendar cal = Calendar.getInstance(); String orderNo = String.valueOf(cal.get(cal.MONTH)+1) + String.valueOf(cal.get(cal.DAY_OF_MONTH)) + String.valueOf(cal.get(cal.YEAR)) + String.valueOf(cal.get(cal.HOUR)) + String.valueOf(cal.get(cal.MINUTE)) + String.valueOf(cal.get(cal.SECOND)); String insertString = "INSERT INTO Beetles VALUES( " + "'" + dialogPanel.nameField.getText() + "'," + "'" + dialogPanel.addressField.getText()+ "'," + "'" + dialogPanel.cityField.getText() + "'," + "'" + dialogPanel.stateField.getText() + "'," + "'" + dialogPanel.zipField.getText() + "'," + "'" + dialogPanel. Field.getText() + "'," + "'" + creditCard + "'," + "'" + orderNo + "')"; stmt.executeUpdate(insertString); stmt.close(); conn.commit(); conn.close(); }

82 CORBA Common Object Request Broker Architecture CORBA er et framework, der muliggør samspil imellem objekter, der er implementeret i forskellige sprog. Arkitekturen er helt analog til RMI’s. ClientServer Stub ORB Skeleton ORB Serverkontrakten defineres i IDL (Interface Definition Language)

83 Andre Java-teknologier JavaBeans Et framework til at definere genbrugelige program- komponenter, der kan manipuleres visuelt. Teknologien baseres på overholdelsen af en række navnekonventioner. Enterprise JavaBeans Udvidelse af JavaBeans med beholder-baserede objekter, der kan kommunikere indbyrdes via netværk.

84 Java Media Framework Java Sound Java Speech Java Telephony Java 2D Java 3D Java Advanced Imaging Java Cryptography Extension Understøtter fortrolighed ved kommunikation over netværk Jini Gør det muligt for forskellige digitale enheder let og hurtigt at udveksle tjenester i et netværk.

85 Ugeseddel oktober - 2. november Intet læsestof og ingen øvelsesopgaver. Der arbejdes med afleveringsopgaven. Næste kursusgang afholdes opgaveseminar og kursus- evaluering. Hver opgavegruppe bedes forberede en 10 minutters fremlæggelse: 1. Hvad går opgaven ud på? 2. Hvor langt er gruppen nået? 3. Hvilke delopgaver mangler at blive løst?