Title: Java Par L'exemple : Le serveur
1Programmation Internetet Intranet Java
complément de cours
S. Frénot INSA Lyon 1998 stephf_at_lisiflory.insa-lyo
n.fr http//lisisun1/sfrenot/cours/
2Paquetage Standards
3Package java.net
- Application Réseau
- URL représente un objet de type URL
- URLConnection/HttpURLConnection représente la
gestion d'une connexion - Socket et ServerSocket représente les points de
connexion TCP - DatagramPacket et DatagramServer représente les
points de connexion UDP - InetAdress représente une adresse TCP/IP
4Package java.io
- Gestion des flux
- Octets InputStream et OutputStream
- Char (2octets) Dérivent de Reader et Writer
- Tubes PipeInputStream, PipeOutputStream
- Accès aux fichiers
- File, FilenameFilter, RandomAccesFile
- Classe de sérialisation d'objets
- ObjectInputStream, ObjectOutputStream
- Classes de service
- Buffered, Zipped, StreamTokenizer
- exemple BufferedInputStream(InputStream in, int
size) - Serialisation
- interface Serializable, writeObject et readObject
5Package java.lang
- La classe Objet
- Types de base Boolean, Character, Byte, Short,
Interger, Long, Float, Void - Math fonctions mathématiques avancées
- String et StringBuffer
- Runtime et System Machine Virtuelle
- Thread, ThreadGroup et Process (Runnable)
- Throwable
6Package java.lang.reflect
- Nécessaire d'Introspection
- Interface member décrit les membres d'une
classe - Classes Constructor, Field, Method
- Classe Modifier
- public, private, protected, static, final,
synchronized, interface, abstract, native - transient non persistant
- volatile variable à jour dans un thread
- Classe Array
- gt très utile pour les composants logiciels
- JavaBean
7Package java.math
- abstract class Number implements Serializable
- BigInteger Entiers de longueur variable
- gt cryptographie
- BigDecimal Nombre réels avec une bonne
précision gt calcul financier
8Packetage java.security
- Provider fournisseur d'algorithmes de cryptage
et de gestion de clés. - Identity entité identifiée par le système de
sécurité - KeyPair clé privée, clé publique pour la
gestion des certificats et des signatures - Certificate atteste qu'une clé publique est
celle du propriétaire. Notion d'attestion par une
entité tierce dite de confiance - Signature mécanisme d'authentification d'un
message et intégrité - Signer générer des signatures
9Package java.sql
- Principes de connexion sur une base de données
- Connection connexion sur un moteur de bases de
données - Driver Sous couche permettant de dialoguer avec
le moteur SQL - DataBaseMetaData Meta données du moteur
- CallableStatement Procédures stockées
- Statement, ResultSet Execution
- gt Wrapper d'ODBC JDBC
10Package java.text
- Internationalisation
- Traduction de texte
- Encodage de caractères
- Format de nombres
- Date et Heures
- Techniques de tri
- Classes
- NumberFormat, DateFormat
- Collator tri de chaînes de caractères
- BreakIterator cesures de mots et de phrases
11Package java.util
- Hashtable, Vector, Enumeration
- --------------------------------
- Calendar, Date, TimeZone
- --------------------------------
- Locale, ResourceBundle
- ----------------------------
- EventObject, EventListener
- ---------------------------
- StringTokenizer, BitSet, Observer et Observable
- java.util.zip
- Sommes de contrôles CRC32 et Alder32
- GZIPInputStream, ZIPInputStream ...
12Package java.applet
Classe Applet Interfaces AppletContext
AppletStub AudioClip
- getAppletInfo, getParameterInfo, init, start,
stop, destroy - --------------------------
- URL getDocumentBase( )
- URL getCodeBase( )
- String getParameter(String name)
- boolean isActive( )
- void appletResize (int width, int heigt)
- -------------------------
- AppletContext getAppletContext( )
- void showDocument(URL url, String target)
- void showStatus(String status)
- Applet getApplet(String name)
- Enumeration getApplets()
- -------------------------
- AudioClip getAudioClip(URL url)
- Image getImage(URL url)
13Package java.rmi
- java.rmi classe pour les proxy clients.
- Exception et interface Remote
- java.rmi.server classe pour les objets serveurs
- RemoteObject, Serialisation...
- java.rmi.dgc Distributed Garbage Collector
- java.rmi.registry Dénomination des objets
14Divers
15Environnement JDK
- JDK1.0 gt JDK 1.1.5 gt JDK 1.2beta
- /bin/javac, java, appletviewer, javadoc ...
- /demo/
- /include/
- /lib/classes.zip
- /src/
16Ressources Java Livres
- JavaSeries O'Reilly
- Français et Anglais
- Couvre tous les aspects tutorial, thread, jdbc,
Beans - Ecris par les concepteurs du langage Exploring
Java (valise) - Bibles de référence
- The Java Language Specification James Gosling,
Bill Joy, Guy Steele Addison-Wesley - Titanium, Sam's Net
- Java client-server
- Cédric Nicolas, Christophe Avare, Frédéric
Najman, Eyrolle - Sun (http//www.sun.com/)
- Spécifications Java, VM, JavaBeans...
- Conception Objets
- Design Patterns Erich Gamma ITP
17Ressources Java Web
- http//www.sun.com
- jdk, documents, pointeurs, projets
- http//www.gamelan.com
- Applet, Scripts, JavaScripts
- http//www.stars.com
- Codes, Exemples, Tutoriels (pas que java)
- JavaDevelopperConnexion
- http//java.sun.com/jdc
- http//java.sun.com/jdc/techDocs/newsletter/index
.html
18Règles d'écriture de code Java
- Un fichier .java par classe
- Entête classique description...
- Commentaires JavaDoc
- Début de bloc / .... /
- Balises _at_author, _at_version, _at_see, _at_param,
_at_return, _at_exception - Exemple
- /
- Affiche un bouton rond
- ltpregt
- BoutonRond b new BoutonRond(titre)
- monPanel.add(b)
- lt/pregt
- _at_see awt.button
- _at_author C. Nicolas
- /
19Convention de nommage
- paquetages minuscule
- classes MajusulePourLaPremiereLettreDeChaqueMot
- méthodes minusculePourLaPremiereCommeLaClasseAp
rès - constantes MAJUSCULE_AVEC_SOULIGNE
- variables/méthodes priv/protected termineParSoulig
ne_ - variables/méthodes statiques termineParDeuxSoulig
nes__ - variables locales à une méthode minuscules_avec_so
ulignes - méthodes fabriquant des objets de classe X newX
- méthodes de conversion retournant des objets de
type X toX - accesseur d'un attribut y de type X X getY()
- accesseur de modification void setY(X valeur)
- classe de définition d'une exception FinDeLaClass
eAvecLeMotException - interface se distinguant d'une classe
similaire InterfaceSeTermineParIfc - classe qui se distingue de son interface ClasseSeT
ermineParImp
20Recommandations 1/2
- Pas de variables d'instance publiques
- Pas d'accesseurs inutiles
- Identifier les variables immuables (pas de
synchro) - Peu de variables/méthodes statiques (classe)
- Long plutôt que int et double / float
- moins d'erreur de dépassement
- Protected mieux que Private
- Minimiser les accès aux variables d'instance dans
les méthodes - utiliser des accesseurs protected
- Pas de surcharge sans nouveau paramètre (sinon
utiliser instanceof()) - Méthodes simples
- Préferer void x.methode1().methode2()
- méthodes publiques synchronized
- Si surcharge de Object.equals() alors surcharge
de Object.hashcode( ) - Pas de clonage intempestif
- Utiliser notifyAll plutot que notify ou resume
21Recommandations 2/2
- Si possible créer un constructeur sans paramètre
- Class.newInstance()
- Pas de final sinon pour de l'optimisation de
performances - Interfaces mieux que classes abstraites (héritage
simple) - Préférer abstract void maMethodeVide() à void
maMethodeVide() - Import java.awt.Button mieux que java.awt.
- Nommer les thread pour le débogage en distant
- Utiliser plutôt implements Runnable que extends
Thread - Ne pas abuser du Garbage Collector (-verbosegc et
-prof) - BufferedInputStream optimisation des
performances - Surcharger toString des classes définies
(debogage) - Ne pas croire tout ce qu'on dit !
22Serveurs Java
- http//jeeves.javasoft.com/
- http//www.acme.com/java/software/Acme.Serve.Serve
.html (Jef Poskanzer) 1500lignes sources - http//www.w3.org/pub/WWW/Jigsaw/
- gt Dynamiques
- gt Multithreads
23 24Java Par L'exemple Le serveur
- import java.net.
- import java.io.
- public class MonServeurWeb
- public static void main( String argv) throws
IOException - ServerSocket ssnew ServerSocket(Integer.parse
Int(argv0)) - while (true) new UneConnexion(ss.accept()).sta
rt() -
- class UneConnexion extends Thread
- Socket client
- UneConnexion (Socket client) throws
SocketException - this.client client
- setPriority(NORM_PRIORITY -1)
-
25Java Par l'Exemple Le serveur
- public void run()
- try
- bufferedReader innew BufferedReader(
- new InputStreamReader(client.getInputSt
ream(), "8859_1")) - OutputStream outclient.getOutputStream()
- PrintWriter poutnew PrintWriter(
- new OutputStreamWriter(out,
""8859_1"), true) - String larequetein.readLine()
- StringTokenizer stnew StringTokenizer(larequet
e) - if ((st.countTokens()gt2)
st.nextToken().equals("GET")) - if ((requestst.nextToken()).startsWith("/"))
- requestrequest.substring(1)
- if ((request.endsWith("/")
request.equals("")) - requestrequest"index.html"
- try
- FileInputStream fisnew FileInputStream(req
uest) - byte datanew bytefis.available()
- fis.read(data)
26 27Relocalisation de page traces
- Shell
- trace/tmp/logrealocations.log
- echo REMOTE_ADDR gtgt trace
- echo "Location http//www.insa-lyon.fr8000"
- echo
- Servlet
- import java.io.
- import java.servlet.
- import java.servlet.http.
- public class gotoUrl extends HttpServlet
- public void service(HttpServletRequest req,
HttpServletResponse res) - throws ServletException, IOException
- DataOutputStream log new DataOutputStream(ne
w FileOutputStream("goto.log", true)) - log.writeChars(req.getRemoteAddr()"\n")
- log.close()
- res.sendRedirect(req.getQueryString())
-
28 29LayoutManager exemples
- import java.awt.
- public class Grid extends java.applet.Applet
- public void init()
- setLayout(new GridLayout(3,2)) //ligne,
colonne (2,0) - add(new Button("Un")
- ...
- add(new Button("cinq")
- import java.awt.
- public class Flow extends java.applet.Applet
- public void init()
- add (new Button("Un"))
- add (new Button("Deux"))
- add (new Button("Trois"))
- add (new Button("Quatre"))
- add (new Button("Cinq"))
30LayoutManager BorderLayout
- import java.awt.
-
- public class uneBordure extends
java.applet.Applet - public void init()
- setLayout (new java.awt.BorderLayout())
- Panel p new Panel()
- p.add(new Button("Est"))
- add(p, "East")
- p new Panel()
- p.add(new Button("Ouest"))
- add (p, "West")
- pnew Panel()
- p.add(new Button("Nord"))
- add (p, "North")
-
-
31LayoutManager CardLayout
- import java.awt.
- public class main extends java.applet.Applet
- CardLayout cards new CardLayout()
- public void init()
- setLayout(cards)
- add(new Button("Un"), "NomCarteUn")
- add(new Button("Deux"), "NomCarteDeux")
-
- public void agir()
- cards.next(this)
- return true
32Calculatrice 1/3
- import java.awt.
- import java.awt.event.
- public class Calculator extends
java.applet.Applet implements ContainerListener,
ActionListener - GridBagConstraints gbc new GridBagConstraints(
) - gbc.weightx1.0 gbc.weihty0
gbc.fillGridBagConstraints.BOTH" - TextField lAffichage new TextField()
- private void addGB(Container cont, Component
comp, int x, int y) - if (!(cont.getLayout() instanceof
GridBagLayout)) - cont.setLayout(new GridBagLayout())
- gbc.gridxx gbc.gridyy
- cont.add(comp, gbc)
-
33Calculatrice 2/3
- public void init()
- setFont(new Font("Monospaced"), Font.BOLD, 24)
- addContainerListener(this)
- gbc.gridwidth4
- addGB(this, lAffichage, 0, 0)
- // haut de la calculatrice
- Panel topRownew Panel( )
- topRow.addContainerListener(this)
- gbc.gridwidth1
- gbc.weightx1.0
- addGB(toprow, new Button("C"),0,0)
- gbc.weightx0.33
- addGB(toprow, new Button(""),0,0)
- gbc.weightx1.0
- addGB(toprow, new Button(""),0,0)
- gbc.gridwidth4
- addGB(this, topRow, 0, 1)
- gbc.weightx1 gbc.gridwidth1
//Les chiffres for (int j0 jlt3 j)
addGB(this, new Button("", ((2-j)3i1)), i,
j2) // -, x, / addGB(this, new Button("-"),
3,2) addGB(this, new Button("x"), 3,2)
addGB(this, new Button("\u00F7"), 3,2) // Ligne
du bas Panel bottomRownew Panel( )
bottomRow.addContainerListener(this)
gbc.weightx1.0 addGB(bottomRow, new
Button("0"),0,0) gbc.weightx0.33
addGB(bottomRow, new Button("."),0,0)
gbc.weightx1.0 addGB(bottomRow, new
Button(""),0,0) gbc.gridwidth4
addGB(this, bottomRow, 0,5)
34Calculatrice 3/3
- public void componentAdded(Container e)
- Component comp e.getChild( )
- if (comp instanceof Button)
- ((Button)comp).addActionListener(this)
-
- public void componentRemoved(ContainerEvent e)
- public void actionPerformed(ActionEvent e)
- if (e.getActionCommand( ).equals("C"))
- theDisplay.setText("")
- else
- theDisplay.setText(theDisplay.getText( )
e.getActionCommand( ) ) -
35Application 1/3 (traitement)
- import java.awt.
- import java.awt.event.
- public class ApplicationSimple // La classe
principale sert de délégué - public void quitterAppli()
- System.exit(0)
-
- public void maximiser(Frame f)
- f.setSize(f.getToolkit().getScreenSize())
-
-
- public static void main(String args)
- ApplicationSimple monApplinew
ApplicatioSimple() - IHMSimple monIHM new IHMSimple(monApli)
36Application 2/3 (IHM)
- class IHMSimple
- public IHMSimple(ApplicationSimple uneAppli)
- Frame maFrame new Frame()
- maFrame.setLayout(new FlowLayout())
- //Premier bouton
- Button monBoutonQuitternew
Button("ATCHAW!") - //On lui donnne un adapatateur
- monBoutonQuitter.addActionListener(new
- MonAdaptateur(MonAdaptateur.QUITTER,
uneAppli)) - //2nd bouton
- Button monBoutonAgrandirnew
Button("Maximise") - //On lui donnne un adapatateur
- monBoutonAgrandir.addActionListener(new
- MonAdaptateur(MonAdaptateur.MAXIMISER
, uneAppli)) - maFrame.add(monBoutonQuitter)
- maFrame.add(monBoutonAgrandir)
- maFrame.pack)
37Application 3/3 Adaptateur
- class MonAdaptateur implements ActionListener
- static final int QUITTER 1
- static final int MAXIMISER 2
- protected int typeAction
- protected ApplicationSimple lAppli
- public MonAdaptateur(int unTypeAction,
ApplicationSimple uneAppli) - typeActionunTypeAction
- lAppliuneAppli
-
-
- public actionPerformed(ActionEvent e)
- Object unComposante.getSource()
- do
- unComposant((Component)unComposant).getParent
- while (!(unComposant instanceof Window))
- Window fenetremere(Window) unComposant
switch (typeAction) case QUITER
lAppli.quitterAppli() break case
AGRANDIR lAppli.maximiser((Frame)fenetremere)
break
38Objets Exemples de codes d'appels
- ltPgtltOBJECT classid"http//www.miamachina.it/analo
gclock.py"gt - lt/objectgt
- ltOBJECT codetype"application/java"
- classid"AudioItem"
- witdh"15" height"15"gt
- ltPARAM name"snd" value"Hello.au"gtlt/OBJECTgt
- ltOBJECT id"clock1"
- classid "clsid663C8FEF-1EF9--11CF-A3DB-080036
F12502" - data"dataapplication/x-oleobjectbase64,
.donn base64."gt - A clocklt/objectgt
- ! ltAPPLET code"Bubble.class" width"500"
heigth"500"gt - Des bulles lt/APPLETgt
39Applet / Standalone
- public class HelloWeb extends Applet
- publc void paint (java.awt.Graphics gc)
- gc.drawStrings ("Hello Web!", 125, 95)
-
- public static void main (String args)
- Frame laFramenew Frame()
- Applet helloWeb new HelloWeb()
- laFrame.add("Center",helloWeb())
- laFrame.setSize(200,200)
- helloWeb.init()
- helloWeb.start()
- theFrame.show()
-
-