Sie sind auf Seite 1von 10

TP: Client/Serveur sur TCP

Applications Distribu ees D. Pellier

Objectifs :
Il sagit dans ce TP dimpl ementer une application client/serveur de remise de chiers en utilisant les services du protocole TCP (protocole de niveau transport en mode connect e, de type ot doctets). Pour cela, il va falloir : 1. mettre en place les programmes, tester la connexion sans rien transf erer. 2. impl ementer des transferts simples (un entier, une cha ne de caract` eres). 3. impl ementer le transfert dun chier de petite taille selon un protocole impos e. 4. impl ementer le transfert dun chier de grande taille selon un protocole que vous d enirez. Nous rappelons que la documentation de lAPI Java est accessible ` a ladresse : http://java.sun.com/ j2se/1.5.0/docs/api/.

Mise en place de lenvironnement

Copier dans votre r epertoire /AD/TP2/ le chier TP2.tar.gz. Les el ements contenus dans ce chier sont : 1. ClientFileTransfer.java : programme principal client, qui sera ` a compl eter ; 2. SserverFileTransfer.java : serveur qui utilise la classe FileTransferService.java. Le programme serveur peut etre lanc e soit en mode it eratif soit en mode parall` ele ; 3. FileTransferService.java : classe service appel ee par le serveur et qui sera ` a compl eter ; 4. FileTransferConstants.java : une interface qui d enit les constantes manipul ees par le protocole de transfert de chier ; 5. emission/ : r epertoire qui contiendra les chiers susceptibles d etre envoy es au serveur ; 6. reception/ : r epertoire qui contiendra les chiers que le serveur recevra. Examiner le programme ClientFileTranfer.java (voir annexe). Pour ex ecuter ce programme, des arguments sont n ecessaires. Lesquels ? Examiner le programme ServerFileTransfer.java (voir annexe). Pour ex ecuter ce programme, des arguments sont n ecessaires. Lesquels ?

Tests des programmes

Il sagit uniquement de mettre en place les el ements minimaux et v erier que vous parvenez eectivement a ` ouvrir, maintenir, et fermer une connexion TCP entre un serveur et un client.

2.1

Test du serveur it eratif

Pour simuler un echange entre le client et le serveur qui ait une dur ee sensible, commencer par ajouter un d elai de 2 seconde dans la m ethode doService() de la classe FileTransferService.java. Pour cela, nous allons nous appuyer sur la m ethode sleep() de la classe Thread :

U.F.R Math ematiques et Informatique: Programmation Orient ee Objets

try { Thread.sleep(2000); } catch (InterruptedException ie) { System.err.println(ie); } 1. Compiler et ex ecuter le serveur ServerFileTransfer.java. 2. Dans une nouvelle fen etre, compiler et ex ecuter le client ClientFileTransfer.java. 3. Ex ecuter de nouveau le client, mais cette fois, donner en param` etre un num ero de port incorrect. Que se passe-t-il ?

2.2

Traitement de plusieurs clients par le serveur en mode it eratif

Lobjectif est de mettre en evidence ce qui se passe si un client essaie de se connecter alors quun autre client est d ej` a connect e. 1. Augmenter les d elais (par exemple 10 secondes) dans FileTransferService.java et ins erer un d elai dans ClientFileTransfer.java an davoir le temps de lancer un client, puis un second avant que le premier ne se termine. 2. Lancer un client, puis un autre avant que le premier ait termin e, donc avant que le serveur se soit remis en ecoute 3. Le deuxi` eme client est-il nalement accept e par le serveur ? Expliquer pourquoi ?

2.3

Test du serveur en mode parall` ele

Reprendre maintenant les essais pr ec edents avec le serveur transfert chier en mode parall` ele. Aucune modication nest ` a apporter si ce nest de modier largument isIteratif ` a la cr eation de linstance de la classe ServerFileTransfer. Ouvrir plusieurs communications simultan ees et noter la di erence de comportement importante entre le serveur it eratif et le serveur parall` ele quand un client se connecte alors quun autre est d ej` a connect e.

2.4

Longueurs des tampons TCP

Il sera utile pour la suite de calculer et aussi dacher les longueurs des tampons (buers) TCP. Les longueurs par d efaut des buers TCP sont d enies par des variables initialis ees par le syst` eme dexploitation. Elles peuvent etre modi ees via linterface des sockets, mais ne le seront cependant pas dans ce TP. 1. Modier ClientFileTransfer.java et ServerFileTransfer.java de fa con ` a enregistrer dans des variables les longueurs par d efaut des buers emission et r eception de votre station. Pour trouver les m ethodes permettant dacc eder ` a ces informations, etudier la documentation de la classe Socket. 2. Faire acher les valeurs obtenues et noter : octets Tampon Tampon Tampon Tampon client emission client r eception serveur emission serveur r eception

3. Est ce que ces valeurs vous semblent importantes ?

Tests de transferts simples

Le but de ce paragraphe est simplement de vous apprendre ` a vous servir des m ethodes des classes DataOutputStream et DataInputStream. La classe DataOutputStream permet d ecrire des donn ees et

U.F.R Math ematiques et Informatique: Programmation Orient ee Objets DataInputStream de les lire, en distinguant leur type.

Remarque. 1 Il est important de noter que le format dencodage des donn ees transmises entre le client et le serveur doit etre identique. Par exemple, lencodage utilis e pour les caract` eres par d efaut sur les stations linux est ISO-5589-15.

3.1

Donn ee de longueur statique

1. Transf erer un entier (4 octets) du client vers le serveur. 2. Transf erer un octet (1 Byte) du client vers le serveur. Remarque. 2 Un n entier Internet z est cod e sur 4 octets, sa longueur est donc statique.

3.2

Donn ee de longueur dynamique

Si la longueur de la donn ee nest pas connue a priori, le r ecepteur ne saura pas combien doctets retirer. Ce sera le cas, lors du transfert dun chier, puisque aussi bien le nom de chier que son contenu sont de longueur dynamique. En dautres termes, ils ne sont connus quau moment de lex ecution. En prenant en compte cette consid eration, r ealiser le transfert dune cha ne de caract` eres du client vers le serveur : Pour le client : une solution simple consiste ` a ecrire dans un premier temps la longueur N de la cha ne (writeInt(int e)), suivie de la cha ne elle-m eme (write(byte[] bytes)) ; Pour le serveur : on lit en premier la longueur N de la cha ne, puis les N octets de la cha ne quon rangera dans un tableau de type Bytes de taille N . Penser ` a d eclarer dynamiquement ce tableau de N octets.

Transfert dun chier de petite taille

On envisage ici le transfert dun chier dont la longueur du contenu (la taille) est inf erieure ` a une valeur d esign ee par MAX_DATA_LENGTH, elle-m eme inf erieure ` a la longueur du tampon TCP r eception du serveur.

4.1

D enition du protocole

Le protocole de niveau application quon vous demande dimpl ementer impose un format pour les messages ainsi que les codes du n champ CONTROL z (1 octet) commun ` a tous les messages. Voici ce format : 1. Messages de donn ees : du serveur au client pour lui indiquer la taille max MAX_DATA_LENGTH quil accepte : CONTROL 1 octet S_PARAMS MAX_DATA_LENGTH 4 octets entier

du client au serveur pour envoyer le chier : CONTROL 1 octet C_DATA NAME_LENGTH 4 octets entier NAME NAME_LENGTH octets DATA_LENGTH 4 octets entier DATA DATA_LENGTH octets

2. Messages de contr ole, aussi bien pour le client que pour le serveur ( n champ CONTROL z uniquement, 1 octet) : C_PROTOCOL_ERROR, C_LEAVE, S_PROTOCOL_ERROR, S_SUCCESS, S_FAILURE.

U.F.R Math ematiques et Informatique: Programmation Orient ee Objets Voici maintenant, la sp ecication de l echange, quand tout se passe correctement :

Client

Serveur Le serveur envoie les paramtres ncessaires au transfert

S_PARAMS,MAX_DATA_SIZE

Le client reoit les paramtres ncessaires au transfert et envoie les donnes concernant le fichier

C_DATA,NAME_LENGTH,NAME,DATA_LENGTH,DATA

S_SUCCESS

Le serveur reoit les donnes, les enregistre dans le fichier et envoie la confirmation de succs

Figure 1 Cas ou le transfert se d eroule normalement. Terminer la sp ecication du protocole en dessinant 2 autres sch emas d echanges : 1. Cas o` u la longueur du contenu est sup erieure ` a MAX_DATA_LENGTH : code de contr ole C_LEAVE. 2. Cas o` u le chier na pu etre enregistr e par le serveur : code de contr ole S_FAILURE. Ce cas correspond a un ` echec du transfert de chier au niveau application.

4.2

Impl ementation

Maintenant, mettez en oeuvre lapplication en respectant le protocole et tenir compte des consignes et indications suivantes : 1. On rappelle que la valeur de MAX_DATA_LENGTH fournie par le serveur au client doit etre inf erieure ` a la longueur du buer TCP r eception du serveur. Par cons equent, MAX_DATA_LENGTH = socket.getReceiveBufferSize() - MAX_HEADER_LENGTH avec MAX_HEADER_LENGTH la taille maximum de lent ete. An de simplier la mise en uvre du protocole, nous prendrons comme valeur 100. 2. Les chiers re cus par le serveur seront rang es dans le r epertoire reception/. 3. Les chiers envoy es par le client seront cr e es dans le r epertoire emission/. 4. Cr eer un chier pour l emission dune certaine taille, par exemple 2000 octets. 5. Le client d eposera le champs DATA du message C_DATA en une seule fois, cest-` a-dire avec un seul write. Il enverra le chier seulement si la longueur de celui-ci est inf erieure ` a la valeur de MAX_DATA_LENGTH fournie par le serveur. Autrement dit, il est n ecessaire de v erier que la longueur du contenu + MAX_HEADER_LENGTH est inf erieure ` a la longueur du buer TCP emission. 6. Le serveur retirera le contenu du chier en une seule fois, cest-` a-dire avec un seul read. 7. Le client ou le serveur doit pouvoir r eagir correctement ` a un message re cu non conforme au protocole. Pr evoir denvoyer un message de contr ole S_PROTOCOL_ERROR ou C_PROTOCOL_ERROR si ce cas se produit, et de traiter correctement la fermeture de la connexion TCP. Illustrez ces di erents cas sous la forme dun diagramme d echanges :

Transfert dun chier de grande taille

A ce stade du d eveloppement, il vous est vivement recommand e de sauvegarder le r esultat de l etape pr ec edente, par exemple : > cd /reseaux > cp -R tcp tcp_petitsfichiers

U.F.R Math ematiques et Informatique: Programmation Orient ee Objets

5.1

Cahier des charges

Un chier de grande taille est un chier dont la longueur du contenu est sup erieure ` a celle du buer TCP r eception du serveur. Se limiter ` a des chiers de taille 3 longueur buer TCP reception du serveur, ce qui sura pour r ealiser des tests pertinents, tout en vous evitant dencombrer inutilement votre espace disque ! Il est clair que le retrait du chier en un seul read devient maintenant impossible. De plus, laction write se bloque si on d epose dans le tampon emission plus doctets que ne peut en contenir le buer emission ! Deux solutions envisageables : 1. Une premi` ere solution consisterait ` a agir au niveau transport sur les param` etres de fonctionnement de TCP pour provoquer l echange automatique de segments vides destin es ` a transmettre r eguli` erement l etat du buer r eception du serveur par linterm ediaire dun champ Advertised Window. Cette solution n ecessite de bien conna tre le param etrage de TCP via les sockets et dans la pratique d epend du syst` eme dexploitation. 2. On va utiliser pour ce TP une solution de niveau application, plus simple ` a d enir et davantage portable, consistant ` a transmettre le chier par blocs de longueur egale ou inf erieure ` a Q octets. Le serveur acquittera syst ematiquement le retrait de chaque bloc, ce qui permettra ` a lentit e TCP du client denvoyer imm ediatemment (Advertised window) le bloc suivant d epos e par le programme client. Voici le d etail : (a) Le serveur proposera au client une longueur Qr pour les blocs quil recevra en fonction de la longueur de son tampon r eception (par exemple Qr = longueur buer TCP r eception MAX_HEADER_LENGTH. (b) Le client proposera au serveur une taille Qe pour les blocs quil emettra en fonction de la longueur de son tampon emission (par exemple Qe = longueur buer TCP emission MAX_HEADER_LENGTH). (c) Le client et le serveur devront donc au d ebut de la connexion echanger Qr et Qe , et ensuite utiliser des blocs de longueur commune Q = min(Qe , Qr ). (d) Voici plus pr ecisemment le calcul du nombre de blocs associ e` a un chier de taille N : N = Q X + R, autrement dit X = N/Q et R = N modulo Q Si R = 0, il y aura exactement X blocs de Q octets ` a transf erer Si R > 0, il y aura exactement X blocs de Q octets et 1 bloc de R octets ` a transf erer

5.2

Sp ecication du protocole

Pour r epondre au n cahier des charges z du paragraphe pr ec edent, et en prenant comme mod` ele la sp ecication propos ee pour les n chiers de petite taille z , d enir un protocole pour les n chiers de grande taille z . Ce protocole devra permettre de transf erer egalement les n chiers de petite taille z . Cette sp ecication comprendra deux parties : 1. Format des messages (et codes du champ CONTROL). 2. Sch emas correspondant aux di erents cas possibles.

5.3

Impl ementation

Modier les programmes client et serveur de fa con ` a mettre en uvre le protocole conform ement au protocole de niveau application que vous avez sp eci e. Sassurer que lapplication fonctionne bien dans les cas de gure suivants : Cas dun n petit chier z Cas dun n grand chier z Cas dun chier arriv e` a bon port mais impossible ` a sauver Cas dune connexion TCP impossible ` a ouvrir Cas dune connexion TCP interrompue.

U.F.R Math ematiques et Informatique: Programmation Orient ee Objets

Annexe
ClientFileTransfer.java

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 import import import import import import import java java java java java java java . i o . DataInputStream ; . i o . DataOutputStream ; . io . File ; . io . IOException ; . net . InetAddress ; . net . Socket ; . net . UnknownHostException ;

/ T h i s c l a s s i m p l e m e n t s a s i m p l e TCP c l i e n t t h a t s e n d s a f i l e < t t > S e r v e r F i l e T r a n s f e r </t t > . @ a u t h o r Damien P e l l i e r @ v e r s i o n 1 . 0 C r e a t e d on 25 nov . 2005 / public final class ClientFileTransfer { / The s o c k e t u s e d by t h e c l i e n t . / p r i v a t e Socket socket ; / The i n p u t s t r e a m o f t h e c l i e n t s o c k e t . / p r i v a t e DataInputStream s i n ; / The o u p u t s t r e a m o f t h e c l i e n t s o c k e t . / p r i v a t e DataOutputStream s o u t ;

to a s p e c i f i c

/ C r e a t e a new < t t > C l i e n t F i l e T r a n s f e r </t t > w i t h t h e < t t > I n e t A d d r e s s </t t > and t h e p o r t o f t h e < t t > S e r v e r F i l e T r a n s f e r </t t > t o c o n t a c t . @param a d d r e s s t h e a d d r e s s o f t h e < t t > C l i e n t F i l e T r a n s f e r </t t > . @param p o r t t h e p o r t o f t h e t h e < t t > C l i e n t F i l e T r a n s f e r </t t > . @param f i l e t h e f i l e t o be s e n t . @throws U n k n o w n H o s t E x c e p t i o n i f t h e s e r v e r d o e s n o t e x i s t . @throws I O E x c e p t i o n i f an I /O e r r o r o c c u r s w h i l e t h e < t t > C l i e n t F i l e T r a n s f e r </t t > i s sending the f i l e . / p u b l i c C l i e n t F i l e T r a n s f e r ( f i n a l S t r i n g address , f i n a l i n t port , f i n a l F i l e f i l e ) t h r o w s Un knownH os tExc eption , I O E x c e p t i o n { // R e s o l v e t h e a d d r e s s f i n a l I n e t A d d r e s s i n e t A d d r e s s = I n e t A d d r e s s . getByName ( a d d r e s s ) ; // C r e a t e t h e s o c k e t n e e d e d t o s e n t t h e f i l e t h i s . s o c k e t = new S o c k e t ( i n e t A d d r e s s , p o r t ) ; // C r e a t e a o u t p u t s t r e a m t o w r i t e i n t h e s o c k e t t h i s . s o u t = new DataOutputStream ( s o c k e t . g e t O u t p u t S t r e a m ( ) ) ; // C r e a t e a i n p u t s t r e a m t o r e a d i n t h e s o c k e t t h i s . s i n = new D a t a I n p u t S t r e a m ( s o c k e t . g e t I n p u t S t r e a m ( ) ) ; // Send t h e f i l e this . sendFile ( f i l e ); // C l o s e t h e o u t p u t s t r e a m t h i s . sout . close ( ) ; // C l o s e t h e i n p u t s t r e a m this . sin . close (); // C l o s e s t h e s o c k e t socket . close ( ) ; } / Sends a f i l e to the s e r v e r . @param f i l e t h e f i l e t o be s e n d . @throws I O E x c e p t i o n i f an I /O e r r o r o c c u r s . / p r i v a t e void s e n d F i l e ( f i n a l F i l e f i l e ) throws IOException { // TO DO System . o u t . p r i n t l n ( TO DO . . . ) ;

U.F.R Math ematiques et Informatique: Programmation Orient ee Objets

67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125

} / Main method o f t h e <code > C l i e n t </code > . @param a r g s t h e a r r a y o f a r g u m e n t s u s e d by t h e <code > C l i e n t F i l e T r a n s f e r </code > . < b r / > [ Usage C l i e n t F i l e T r a n s f e r HOSTNAME PORT FILE ] : < b r /> <u l > < l i > HOSTNAME I P a d d r e s s o f t h e M e s s a g e S e r v e r . < / l i > < l i > PORT p o r t t o w h i c h t h e s e r v e r must be bound ( 1 0 2 4 <= p o r t <= 65535). < / l i > < l i > FILE f i l e t o be s e n t . < / l i > </u l > / p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { // Command l i n e p r o c e s s i n g String address = null ; File f i l e = null ; int port = 0; i f ( a r g s . l e n g t h == 3 ) { address = args [ 0 ] ; port = Integer . parseInt ( args [ 1 ] ) ; f i l e = new F i l e ( a r g s [ 2 ] ) ; i f (! f i l e . exists ()) { System . e r r . p r i n t l n ( E r r o r : t h e f i l e System . e x i t ( 0 ) ; } i f ( ! f i l e . canRead ( ) ) { System . e r r . p r i n t l n ( E r r o r : t h e f i l e System . e x i t ( 0 ) ; } } else { displayUsage () ; System . e x i t ( 0 ) ; }

+ f i l e . getName ( ) + d o e s n o t e x i s t . ) ;

+ f i l e . getName ( ) + c a n n o t be r e a d . ) ;

// C r e a t e s t h e C l i e n t F i l e T r a n s f e r try { f i n a l C l i e n t F i l e T r a n s f e r c l i e n t = new C l i e n t F i l e T r a n s f e r ( a d d r e s s , p o r t , } catch ( UnknownHostException e ) { System . e r r . p r i n t l n ( The s e r v e r + a d d r e s s + d o e s n o t e x i s t . ) ; e . printStackTrace () ; } catch ( IOException e ) { System . e r r . p r i n t l n ( An I /O e r r o r o c c u r s w h i l e s e n d i n g f i l e . ) ; e . printStackTrace () ; } }

f i l e );

/ D i s p l a y s t h e command l i g n e u s a g e o f t h e < t t > C l i e n t F i l e T r a n s f e r </t t > . / private s t a t i c void displayUsage () { System . o u t . p r i n t ( [ Usage C l i e n t F i l e T r a n s f e r HOSTNAME PORT FILE : \ n + HOSTNAME I P a d d r e s s o f t h e M e s s a g e S e r v e r . \ n + PORT p o r t t o w h i c h t h e s e r v e r i s bound ( 1 0 2 4 <= p o r t <= 6 5 5 3 5 ) . \ n + FILE f i l e t o be s e n t . \ n ) ; }

ServerFileTransfer.java

1 2 3 4 5 6 7 import j a v a . i o . IOException ; import j a v a . net . ServerSocket ; import j a v a . net . Socket ; / T h i s c l a s s i m p l e m e n t s a s i m p l e TCP s e r v e r t h a t r e c e i v e s

f i l e from

U.F.R Math ematiques et Informatique: Programmation Orient ee Objets

8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78

c l i e n t and w r i t e s i t on d i s k . @ a u t h o r Damien P e l l i e r @ v e r s i o n 1 . 0 C r e a t e d on 25 nov . 2005 / public final class ServerFileTransfer { / C r e a t e s a new < t t > S e r v e r F i l e T r a n s f e r </t t > b i n d t o a s p e c i f i c p o r t . @param p o r t t h e p o r t t h e < t t >M e s s a g e S e r v e r </t t > i s bound . @param i s I t e r a t i f t h e b o o l e a n f l a g t o i n d i c a t e i f t h e s e r v e r i s i t e r a t i f or concurrent . @throws I O E x c e p t i o n i f an I /O e r r o r o c c u r s when o l s p e n i n g t h e socket . @throws S e c u r i t y E x c e p t i o n i f a s e c u r i t y manager e x i s t s and i t s c h e c k L i s t e n method d o e s n t a l l o w t h e o p e r a t i o n . / p u b l i c S e r v e r F i l e T r a n s f e r ( f i n a l i n t port , f i n a l boolean i s I t e r a t i f ) throws IOException { f i n a l S e r v e r S o c k e t l i s t e n S o c k e t = new S e r v e r S o c k e t ( p o r t ) ; System . o u t . p r i n t l n ( S e r v e r F i l e T r a n s f e r w a i t i n g c o n n e x i o n s on + p o r t + . . . ) ; while ( true ) { f i n a l Socket t r a n s f e r S o c k e t = l i s t e n S o c k e t . accept ( ) ; final FileTransferService fileTransferService = new F i l e T r a n s f e r S e r v i c e ( t r a n s f e r S o c k e t ) ; if ( isIteratif ) { fileTransferService . doService (); } else { f i l e T r a n s f e r S e r v i c e . doServiceInAThread ( ) ; } } } / Main method o f t h e <code > S e r v e r F i l e T r a n s f e r </code > . @param a r g s t h e a r r a y o f a r g u m e n t s u s e d by t h e <code > S e r v e r F i l e T r a n s f e r </c o d e . < b r /> [ Usage S e r v e r F i l e T r a n s f e r < p o r t > : < b r /> <u l > < l i > p o r t t h e p o r t t o w h i c h t h e s e r v e r must be bound ( 1 0 2 4 <= p o r t <= 65535). < / l i > </u l > / p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { // Command l i n e p r o c e s s i n g int port = 0; i f ( a r g s . l e n g t h == 1 ) { port = Integer . parseInt ( args [ 0 ] ) ; } else { displayUsage () ; System . e x i t ( 0 ) ; } i f ( p o r t < 1024 | | p o r t > 6 5 5 3 5 ) { displayUsage () ; System . e x i t ( 0 ) ; } // C r e a t e s t h e M e s s a g e S e r v e r try { f i n a l S e r v e r F i l e T r a n s f e r s e r v e r = new S e r v e r F i l e T r a n s f e r ( p o r t , t r u e ) ; } catch ( IOException e ) { System . o u t . p r i n t l n ( An I /O e r r o r o c c u r s when o p e n i n g t h e s o c k e t . ) ; e . printStackTrace () ; } } / D i s p l a y s t h e command l i g n e u s a g e o f t h e s e r v e r . /

U.F.R Math ematiques et Informatique: Programmation Orient ee Objets

79 80 81 82 83

private s t a t i c void displayUsage () { System . e r r . p r i n t ( [ Usage S e r v e r F i l e T r a n s f e r PORT] \ n + PORT t h e p o r t t o w h i c h t h e s e r v e r must be bound ( 1 0 2 4 <= p o r t <= 6 5 5 3 5 ) . \ n ) ; }

FileTransferService.java

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 import import import import java java java java . i o . DataInputStream ; . i o . DataOutputStream ; . io . IOException ; . net . Socket ;

/ The c l a s s i m p l e m e n t s t h e s e r v i c e e x e c u t e d by t h e s e r v e r . @ a u t h o r Damien P e l l i e r @ v e r s i o n 1 . 0 C r e a t e d on 26 j a n v . 2006 / p u b l i c f i n a l c l a s s F i l e T r a n s f e r S e r v i c e e x t e n d s Thread { / The s o c k e t o f t h e s e r v i c e . / p r i v a t e Socket socket ; / C r e a t e s a new < t t > F i l e T r a n s f e r S e r v i c e </t t > from a s p e c i f i c < t t >S o c k e t </t t > . @param s o c k e t t h e < t t >S o c k e t </t t > . / p u b l i c F i l e T r a n s f e r S e r v i c e ( f i n a l Socket socket ) { this . socket = socket ; } / Runs t h e method e x e c u t e ( ) i n a s e p a r a t e t h r e a d . T h i s method o v e r r i d e s r u n method o f c l a s s < t t >Thread </t t > . / p u b l i c void run ( ) { try { this . doService (); } catch ( Exception e ) { System . e r r . p r i n t l n ( E r r o r i n method d o S e r v i c e ( ) . ) ; e . printStackTrace () ; } } / E x e c u t e s t h e s e r v i c e i n a < t t >Thread </t t > . / public void doServiceInAThread () { this . start (); } / E x e c u t e s t h e < t t > F i l e T r a n s f e r S e r v i c e </t t > . @throws I O E x c e p t i o n i f a I /O e r r o r o c c u r s . / p u b l i c void d o S e r v i c e ( ) throws IOException { // C r e a t e a o u t p u t s t r e a m t o w r i t e i n t h e s o c k e t f i n a l DataOutputStream s o u t = new DataOutputStream ( s o c k e t . g e t O u t p u t S t r e a m ( ) ) ; // C r e a t e a i n p u t s t r e a m t o r e a d i n t h e s o c k e t f i n a l D a t a I n p u t S t r e a m s i n = new D a t a I n p u t S t r e a m ( s o c k e t . g e t I n p u t S t r e a m ( ) ) ; // TO DO System . o u t . p r i n t l n ( TO DO . . . ) ; }

U.F.R Math ematiques et Informatique: Programmation Orient ee Objets

10

FileTransferConstants.java

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 / T h i s i n t e r f a c e d e f i n e s t h e c o n s t a n t s u s e d by t h e f i l e t r a n s f e r p r o t o c o l . T h i s i n t e r f a c e i s d e f i n e d i n j a v a 1 . 4 s t y l e f o r c o m p a t i b i l i t y . I t would be b e t t e r t o u s e t h e enum c l a s s d e f i n e d i n j a v a 1 . 5 . @ a u t h o r Damien P e l l i e r @ v e r s i o n 1 . 0 C r e a t e d on 27 j a n v . 2006 / public interface FileTransferConstants { / The maximum l e n g t h o f h e a d e r / s t a t i c f i n a l i n t MAX HEADER LENGTH = 1 0 0 ; / C PROTOCOL ERROR m e s s a g e c o n t r o l . / s t a t i c f i n a l b y t e C PROTOCOL ERROR = 0 ; / C DATA m e s s a g e c o n t r o l . / s t a t i c f i n a l b y t e C DATA = 2 ; / C LEAVE m e s s a g e c o n t r o l . / s t a t i c f i n a l b y t e C LEAVE = 3 ; / S PROTOCOL ERROR m e s s a g e c o n t r o l . / s t a t i c f i n a l b y t e S PROTOCOL ERROR = 6 4 ; / S PARAMS m e s s a g e c o n t r o l . / s t a t i c f i n a l b y t e S PARAMS = 6 5 ; / S SUCCESS m e s s a g e c o n t r o l . / s t a t i c f i n a l b y t e S SUCCESS = 6 6 ; / S FAILURE m e s s a g e c o n t r o l / s t a t i c f i n a l b y t e S FAILURE = 6 7 ;

Das könnte Ihnen auch gefallen