Professional Documents
Culture Documents
Eric Cariou
Universit de Pau et des Pays de l'Adour Dpartement Informatique Eric.Cariou@univ-pau.fr
1
TCP ou UDP
Communication entre systmes aux extrmits Pas de visi i!it des systmes intermdiaires
Application TCP/UDP IP Liaison Physique IP Liaison Physique
2
!dressa"e
#dresse (P et numro de port Ex * 1+2.12+.12.", Ce numro est en entier d-une va!eur .ue!con.ue
Ports / 102, * rservs pour !es app!ications ou protoco!es systmes Exemp!e * 10 ' 2TTP3 21 ' 4TP3 ...
5oc7et * prise
Sockets
5ervices d-mission et de rception de donnes sur !a soc7et via !e port En mode connect 9TCP:
Connexion ' tuyau entre 2 app!ications distantes Une soc7et est un des deux outs du tuyau C)a.ue app!ication a une soc7et !oca!e pour $rer !a communication 8 distance 5ur un port prcis 8 !a demande du pro$ramme 5ur un port .ue!con.ue !i re dtermin par !e systme ,
Sockets
E!!e permet !a communication avec un port distant sur une mac)ine distante * c-est-8-dire avec une app!ication distante <
>e cot serveur communi.ue via une soc7et !ie 8 un port prcis * port d-coute >e c!ient initie !a connexion ou !a communication ?
Dissymtrie de !a communication=connexion
Sockets UDP
Bode data$ramme
Envois de pa.uets de donnes 9data$rammes: Pas de connexion entre parties c!ient et serveur Pas de fia i!it ou de $estion de !a communication
Un pa.uet peut ne pas arriv 9perdu par !e rseau: Un pa.uet P2 envoy aprs un pa.uet P1 peut arriver avant ce pa.uet P1 9se!on !a $estion des routes dans !e rseau:
Principe de communication
>a partie serveur cre une soc7et et !a !ie 8 un port UDP particu!ier >a partie c!ient cre une soc7et pour accder 8 !a couc)e UDP et !a !ie sur un port .ue!con.ue
1
>e serveur se met en attente de rception de pa.uet sur sa soc7et >e c!ient envoie un pa.uet via sa soc7et en prcisant !-adresse du destinataire
@(P de !a mac)ine sur !a.ue!!e tourne !a partie serveur et numro de port sur !e.ue! est !ie !a soc7et de !a partie serveur
5i !e c!ient envoie un pa.uet avant .ue !e serveur ne soit pr;t 8 recevoir * !e pa.uet est perdu
+
10
C!asse InetAddress
Constructeurs
Pas de constructeurs3 on passe par des mt)odes stati.ues pour crer un o @et
public static InetAddress getByName(String host) throws UnknownHostE ception
Bt)odes
Cre un o @et InetAddress identifiant une mac)ine dont !e nom est pass en paramtre >-exception est !eve si !e service de nom 9DG5...: du systme ne trouve pas de mac)ine du nom pass en paramtre sur !e rseau 5i prcise une adresse (P sous forme de c)aCne 9--1+2.12.2".2,--: au !ieu de son nom3 !e service de nom n-est pas uti!is Une autre mt)ode permet de prciser !-adresse (P sous forme d-un ta !eau de , octets
11
C!asse InetAddress
Bt)odes 9suite:
Hetourne !-adresse (P de !a mac)ine sur !a.ue!!e tourne !e pro$ramme3 c-est-8-dire !-adresse (P !oca!e Hetourne !e nom de !a mac)ine dont !-adresse est code par !-o @et (net#ddress
12
C!asse "atagram#acket
5tructure des donnes en mode data$ramme Constructeurs
Cration d-un pa.uet pour recevoir des donnes 9sous forme d-un ta !eau d-octets: >es donnes reEues seront p!aces dans bu& length prcise !a tai!!e max de donnes 8 !ire
Ge pas prciser une tai!!e p!us $rande .ue ce!!e du ta !eau En $nra!3 length ' tai!!e de bu&
1"
C!asse "atagram#acket
Constructeurs 9suite:
Cration d-un pa.uet pour envoyer des donnes 9sous forme d-un ta !eau d-octets: bu& * contient !es donnes 8 envoyer length * !on$ueur des donnes 8 envoyer
address * adresse (P de !a mac)ine destinataire des donnes port * numro de port distant 9sur !a mac)ine destinataire: oJ envoyer !es donnes
1,
C!asse "atagram#acket
Bt)odes % $et &
InetAddress getAddress()
5i pa.uet 8 envoyer * adresse de !a mac)ine destinataire 5i pa.uet reEu * adresse de !a mac)ine .ui a envoy !e pa.uet 5i pa.uet 8 envoyer * port destinataire sur !a mac)ine distante 5i pa.uet reEu * port uti!is par !e pro$ramme distant pour envoyer !e pa.uet Donnes contenues dans !e pa.uet 5i pa.uet 8 envoyer * !on$ueur des donnes 8 envoyer 5i pa.uet reEu * !on$ueur des donnes reEues
int get#ort()
byte$% get"ata
int get!ength()
1<
C!asse "atagram#acket
Bt)odes % set &
Positionne !-adresse (P de !a mac)ine destinataire du pa.uet Positionne !e port destinataire du pa.uet pour !a mac)ine distante Positionne !es donnes 8 envoyer Positionne !a !on$ueur des donnes 8 envoyer
1?
Pour tenir dans un seu! data$ramme (P3 !e data$ramme UDP ne doit pas contenir p!us de ?<,?D octets de donnes
Un data$ramme UDP est rarement envoy via p!usieurs data$rammes (P Car !a p!upart des systmes !imitent 8 1 Ko !a tai!!e des data$rammes UDP
Pour ;tre certain de ne pas perdre de donnes * <12 octets max 5i data$ramme UDP trop $rand * !es donnes sont tron.ues
5i ta !eau d-octets en rception est p!us petit .ue !es donnes envoyes
C!asse "atagramSocket
5oc7et en mode data$ramme Constructeurs
Cre une nouve!!e soc7et en !a !iant 8 un port .ue!con.ue !i re Exception !eve en cas de pro !me 9a priori i! doit pas y en avoir:
Cre une nouve!!e soc7et en !a !iant au port !oca! prcis par !e paramtre port Exception !eve en cas de pro !me * notamment .uand !e port est d@8 occup
11
C!asse "atagramSocket
Envoie !e pa.uet pass en paramtre. >e destinataire est identifi par !e coup!e @(P=port prcis dans !e pa.uet Exception !eve en cas de pro !me d-entre=sortie
HeEoit un pa.uet de donnes L!o.uant tant .u-un pa.uet n-est pas reEu Muand pa.uet arrive3 !es attri uts de p sont modifis >es donnes reEues sont copies dans !e ta !eau pass en paramtre !ors de !a cration de p et sa !on$ueur est positionne avec !a tai!!e des donnes reEues >es attri uts d-@(P et de port de p contiennent !-@(P et !e port de !a soc7et distante .ui a mis !e pa.uet
1+
C!asse "atagramSocket
#utres mt)odes
4erme !a soc7et et !i re !e port 8 !a.ue!!e e!!e tait !ie Hetourne !e port !oca! sur !e.ue! est !ie !a soc7et
Pour restreindre !a communication avec un seu! destinataire distant Car par dfaut peut recevoir sur !a soc7et des pa.uets venant de n-importe oJ 20
C!asse "atagramSocket
E!!e retourne norma!ement si un pa.uet est reEu en moins du temps positionn par !-appe! de setSo*imeout >-exception Socket*imeoutE ception est !eve pour indi.uer .ue !e d!ai s-est cou! avant .u-un pa.uet ne soit reEu Socket*imeoutE ception est une sous-c!asse de I)E ception
21
== cration du pa.uet avec !es donnes et en prcisant !-adresse du serveur == 9@(P et port sur !e.ue! i! coute * DDDD: packet = new DatagramPacket(data, data.length, adr, 7777); == cration d-une soc7et3 sans !a !ier 8 un port particu!ier socket = new DatagramSocket(); == envoi du pa.uet via !a soc7et socket.send(packet);
22
DatagramSocket socket; DatagramPacket packet; == cration d-une soc7et !ie au port DDDD DatagramSocket socket = new DatagramSocket(7777); == ta !eau de 1< octets .ui contiendra !es donnes reEues byte[] data = new byte[15]; == cration d-un pa.uet en uti!isant !e ta !eau d-octets packet = new DatagramPacket(data, data.length); == attente de !a rception d-un pa.uet. >e pa.uet reEu est p!ac dans == pac7et et ses donnes dans data. socket.receive(packet); == rcupration et affic)a$e des donnes 9une c)aCne de caractres: String chaine = new String(packet.getData(), 0, packet.getLength()); System.out.println(" recu : "+chaine);
2"
2<
#vanta$es
5imp!e 8 pro$rammer 9et 8 appr)ender: Pas fia !e Ge permet d-envoyer .ue des ta !eaux de yte
(nconvnients
2?
Et attention 8 !a tai!!e rserve * si !e rcepteur rserve un ta !eau trop petit par rapport 8 ce!ui envoy3 une partie des donnes est perdue Un o @et .ue!con.ue en yteNO pour !-envoyer Un yteNO en un o @et d-un certain type aprs rception Crer !es mt)odes .ui font ce!a * !ourd et domma$e de faire des tPc)es de si % as-niveau & avec un !an$a$e vo!u comme Fava Uti!iser !es f!ux Fava pour conversion automati.ue 2D
Deux so!utions
Pour mettre et recevoir n-importe .ue! o @et via des soc7ets UDP
En criture * conversion de Q @ect en yteNO
ByteArrayOutputStream byteStream = new ByteArrayOutputStream(); ObjectOutputStream objectStream = new ObjectOutputStream(byteStream); objectStream.writeObject(object); byte[] byteArray = byteStream.toByteArray();
Sockets TCP
2+
"0
Principe de communication
>e serveur !ie une soc7et d-coute sur un certain port ien prcis et appe!!e un service d-attente de connexion de !a part d-un c!ient >e c!ient appe!!e un service pour ouvrir une connexion avec !e serveur
Du cot du serveur3 !e service d-attente de connexion retourne une soc7et de service 9associe 8 un port .ue!con.ue:
Comme avec soc7ets UDP * !e c!ient et !e serveur communi.uent en envoyant et recevant des donnes via !eur soc7et "1
B;me c!asse .ue ce!!e dcrite dans !a partie UDP et usa$e identi.ue
Socket * soc7et mode connect ServerSocket * soc7et d-attente de connexion du cot server
"2
C!asse 5oc7et
5oc7et mode connect Constructeurs
Cre une soc7et !oca!e et !a connecte 8 un port distant d-une mac)ine distante identifi par !e coup!e address/port
(dem mais avec nom de !a mac)ine au !ieu de son adresse (P code >ve !-exception UnknownHostException si !e service de nom ne parvient pas 8 identifier !a mac)ine
Iariante de ces 2 constructeurs pour prciser en p!us un port !oca! sur !e.ue! sera !ie !a soc7et cre ""
C!asse 5oc7et
OutputStream getOutputStream()
Hetourne !e f!ux de sortie permettant d-envoyer des donnes via !a soc7et Hetourne !e f!ux d-entre permettant de recevoir des donnes via !a soc7et
InputStream getInputStream()
public close()
",
C!asse 5oc7et
Henvoie !e port distant avec !e.ue! est connect !a soc7et Henvoie !-adresse (P de !a mac)ine distante Henvoie !e port !oca! sur !e.ue! est !ie !a soc7et
InetAddress getAddress()
int getLocalPort()
5i temps dpass !ors d-une !ecture * exception SocketTimeoutException est !eve Par dfaut * temps infini en !ecture sur !e f!ux
"<
C!asse 5erver5oc7et
Cre une soc7et d-coute 9d-attente de connexion de !a part de c!ients: >a soc7et est !ie au port dont !e numro est pass en paramtre >-exception est !eve notamment si ce port est d@8 !i 8 une soc7et
Bt)odes
#ttente de connexion d-un c!ient distant Muand connexion est faite3 retourne une soc7et permettant de communi.uer avec !e c!ient * soc7et de service Positionne !e temps maximum d-attente de connexion sur un accept 5i temps cou!3 !-accept !ve !-exception SocketTimeoutException Par dfaut3 attente infinie sur !-accept
"?
Cot c!ient
== adresse (P du serveur InetAddress adr = InetAddress.getByName("scinfr222"); == ouverture de connexion avec !e serveur sur !e port DDDD Socket socket = new Socket(adr, 7777);
"D
"1
== serveur positionne sa soc7et d-coute sur !e port !oca! DDDD ServerSocket serverSocket = new ServerSocket(7777); == se met en attente de connexion de !a part d-un c!ient distant Socket socket = serverSocket.accept(); == connexion accepte * rcupre !es f!ux o @ets pour communi.uer == avec !e c!ient .ui vient de se connecter ObjectOutputStream output = new ObjectOutputStream(socket.getOutputStream()); ObjectInputStream input = new ObjectInputStream(socket.getInputStream()); == attente !es donnes venant du c!ient String chaine = (String)input.readObject(); System.out.println(" recu : "+chaine);
"+
== affic)e !es coordonnes du c!ient .ui vient de se connecter System.out.println(" ca vient de : " +socket.getInetAddress()+":"+socket.getPort()); == envoi d-une rponse au c!ient output.writeObject(new String("bien recu"));
String chaine; Personne pers; Object obj = input.readObject(); if (obj instanceof String) chaine = (String)obj; if (obj instanceof Personne) pers = (Personne)obj;
,0
Sockets TCP
(nconvnients
Gcessite du para!!!isme avec des t)reads 9voir suite cours: Bais o !i$e une onne structuration cot serveur
,1
TCP est fia !e et mieux structur 5i !a fia i!it n-est pas essentie!!e 5i !a connexion entre !es 2 app!ications n-est pas uti!e Exemp!e
Un t)ermomtre envoie toutes !es < secondes !a temprature de !-air am iant 8 un affic)eur distant
Pas $rave de perdre une mesure de temps en temps Pas $rave d-envoyer !es mesures m;me si !-affic)eur est a sent
,2
# priori TCP mieux adapt car esoin de fia i!it !ors des transferts des fic)iers3 mais
Peu de pertes de pa.uets TCP $re un protoco!e assurant !a fia i!it imp!i.uant de nom reux c)an$es supp!mentaires entre !es app!ications 9envoi d-ac.uittement...: Peu de perte de pa.uet en UDP en !oca! * peu directement $rer !a fia i!it au niveau G45 ou app!icatif et c-est moins couteux en temps
Dans ce contexte3 i! n-est pas pna!isant d-uti!iser UDP au !ieu de TCP pour G45
,"
,,
Concurrence
,<
Une soc7et d-coute sert 8 attendre !es connexions des c!ients # !a connexion d-un c!ient3 une soc7et de service est initia!ise pour communi.uer avec ce c!ient Envoi de donnes 8 un c!ient
UDP * on prcise !-adresse du c!ient dans !e pa.uet 8 envoyer TCP * uti!ise !a soc7et correspondant au c!ient UDP * se met en attente d-un pa.uet et re$arde de .ui i! vient TCP * doit se mettre en attente de donnes sur toutes !es soc7ets actives ,?
Tant .ue des donnes ne sont pas reEues Fus.u-8 !a proc)aine connexion d-un c!ient distant
5i ne sait pas .ue! est !-ordonnancement des arrives des donnes des c!ients ou de !eur connexion au serveur
(mpossi !e 8 $rer
Un processus en attente de connexion sur !e port d-coute Gouve!!e connexion * un nouveau processus est cr pour $rer !a communication avec !e nouveau c!ient ,D
,1