IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs Discussion :

Application client/server rapide


Sujet :

Plateformes (Java EE, Jakarta EE, Spring) et Serveurs

  1. #1
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Points : 25
    Points
    25
    Par défaut Application client/server rapide
    plop,

    cas ecole, je dois realiser un server/client, le client envoie des addition ou soustraction infixe au server et celui ci renvoi le resultat au client.

    le protocole est le suivant :
    client > envoie signe, envoie nombre 1, envoie nombre 2
    server > calcul puis renvoi
    client > reception, affichage, puis envoi de y ou n pour continuer
    server > reception de y ou n et on continue ou on arrette

    client

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    package client_server;
     
    import java.io.*;
    import java.net.*;
     
    import utilitaire.Clavier;
     
     
    public class client {
     
    	/**
             * @param argv
             */
    	public static void main( String[] argv ){
    		try {
     
    			InetAddress adresseServeur = InetAddress.getByName( "localhost" );	// recherche de l'adresse du serveur
    			Socket client = new Socket( adresseServeur, 2010 );					// connection au serveur
     
    			InputStream InputString = client.getInputStream();
    			DataInputStream DIS = new DataInputStream(InputString);
     
    			OutputStream OutputString = client.getOutputStream();
    			DataOutputStream DOS = new DataOutputStream(OutputString);
     
    			char signe;
    			char continuation;
    			String buffer;
    			int nb1;
    			int nb2;
    			int result;
    			do{
    			   continuation = 'n';
    			   System.out.println( "C>signe + ou - ? : ");
    			   buffer = Clavier.lireString();
    			   signe = buffer.charAt(0);
     
    			   System.out.println( "C>premier nombre : ");
    			   nb1 = Clavier.lireInt();
    			   System.out.println( "C>deuxiemme nombre : ");
    			   nb2 = Clavier.lireInt();
     
    			   DOS.writeChar(signe);								// envoi d'une trame au serveur
    			   DOS.writeInt(nb1);
    			   DOS.writeInt(nb2);
     
    			   result = DIS.readInt();
     
    			   System.out.println( "C> reponse server : " +result );
     
    			   System.out.println( "C> on continue? (y/n): ");
    			   buffer = Clavier.lireString();
    			   continuation = buffer.charAt(0);
     
    			   DOS.writeChar(continuation);
    			   }while(continuation == 'y');
    			//Thread.sleep( 5000 );
     
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		System.out.println("finit");
    	}
     
    }
    server

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    67
     
    package client_server;
     
    import java.io.*;
    import java.net.*;
     
    import utilitaire.Clavier;
     
    public class server {
     
    	/**
             * @param argv
             */
    	public static void main( String[] argv ){
    		try {
     
     
     
    			InetAddress adresseServeur = InetAddress.getByName( "localhost" );	// recherche de l'adresse du serveur
    			Socket client = new Socket( adresseServeur, 2010 );					// connection au serveur
     
    			InputStream InputString = client.getInputStream();
    			DataInputStream DIS = new DataInputStream(InputString);
     
    			OutputStream OutputString = client.getOutputStream();
    			DataOutputStream DOS = new DataOutputStream(OutputString);
     
    			char signe;
    			char continuation;
    			String buffer;
    			int nb1;
    			int nb2;
    			int result;
    			do{
    			   continuation = 'n';
    			   System.out.println( "C>signe + ou - ? : ");
    			   buffer = Clavier.lireString();
    			   signe = buffer.charAt(0);
     
    			   System.out.println( "C>premier nombre : ");
    			   nb1 = Clavier.lireInt();
    			   System.out.println( "C>deuxiemme nombre : ");
    			   nb2 = Clavier.lireInt();
     
    			   DOS.writeChar(signe);								// envoi d'une trame au serveur
    			   DOS.writeInt(nb1);
    			   DOS.writeInt(nb2);
     
    			   result = DIS.readInt();
     
    			   System.out.println( "C> reponse server : " +result );
     
    			   System.out.println( "C> on continue? (y/n): ");
    			   buffer = Clavier.lireString();
    			   continuation = buffer.charAt(0);
     
    			   DOS.writeChar(continuation);
    			   }while(continuation == 'y');
    			//Thread.sleep( 5000 );
     
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		System.out.println("finit");
    	}
     
    }
    voila, ça marche, maintenant je voudrais pouvoir gerer plusieur client en meme temps, pour ce faire, j'utilise des thread

    je ne touche pas au client, aucun interet, pour le server :
    je met la partie code dans le run() du thread
    je met la partie attente de connection dans le main du server, et a chaque connection, je creer un nouveau thread

    seulement voila, regardez moi ça :



    Uploaded with ImageShack.us

    socketClient.getInputStream n'est plus reconnu, une idée de pourquoi?

    merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 144
    Points : 95
    Points
    95
    Par défaut
    je ne crois pas que tu puisses passer le Socket directement dans la signature de la méthode run().

    Passe plutot par un constructeur ou par un setter dans cette meme classe.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Points : 25
    Points
    25
    Par défaut
    ah mais oui, c'est totalement beta ce que j'ai fait xD

    comment je veux le passer en parametre vu que seul le constructeur est appelé au debut et peut prendre des parametre

  4. #4
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Points : 25
    Points
    25
    Par défaut
    ba ça ne mrche pas =p

    je ne sais pas si c'est ma façon de lance un thread ou pas, regardez


    aors deja : jai une disaine de chose surligner, toute les requette, etc, eclipse veut que je les entoure de try, catch
    alors que dans ma version non threadé ça ne le derangais pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
     
    package server;
     
    import java.net.* ;
    import java.io.* ;
     
    /**
     * But : le serveur reçoit des données en provenance du client
     * @author root
     *
     */
    public class threaders extends Thread{
     
    	private int numero;
    	private Socket socketClient;
     
    	threaders(Socket newSocketClient, int n)
    	{
    	socketClient = newSocketClient;
    	numero = n;
    	}
     
    	public void run()
    		{
     
    		System.out.println( "serveur : client accepté : " + socketClient );
     
    		InputStream InputString = socketClient.getInputStream();
    		DataInputStream DIS = new DataInputStream(InputString);
     
    		OutputStream OutputString = socketClient.getOutputStream();
    		DataOutputStream DOS = new DataOutputStream(OutputString);
     
    		char signe;
    		int nb1, nb2, result;
    		char continuation;
     
    		do{
    		    continuation = 'n';
    		    signe = DIS.readChar();				// lecture d'une trame réseau dans un tableau de bytes
    		    nb1 = DIS.readInt();
    			nb2 = DIS.readInt();
     
    			if (signe == '+')
    				result = nb1+nb2;
    			else
    				result = nb1-nb2;
     
    			System.out.println( "S>données reçues de client "+ numero +": " + signe + nb1 + "|" + nb2 );
     
    			System.out.println("S>resultat renvoyé :" +result+"a client "+numero);
    			DOS.writeInt(result);
     
    			continuation = DIS.readChar();	
    		}while(continuation == 'y');
     
    		System.out.println("fin de connection avec client : " +numero);
    		}
     
    	public static void main( String[] argv ){
    		int counter = 0;
    		while(true)
    		{
    		try {
     
    			ServerSocket serveur = new ServerSocket( 2010 );	// ouverture du port 2010, creation du serveur
     
    			System.out.println( "serveur : attente connection" );
     
    			Socket socketClient = serveur.accept();				// attente de connection du client
    			counter++;
    			//creation et lancement du thread
    			threaders servor = new threaders(socketClient, counter);
    			servor.start();
    			} catch (Exception e) 
    				{
    				e.printStackTrace();
    				}
     
    	  }//fin du while
     
     
       }//fin du main
     
    }  //fin de la classe
    donc voila, le code du server dans le run(), le constructeur qui recupere le socket et numero de la communication

    et ma boucle infinit dans le main

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 144
    Points : 95
    Points
    95
    Par défaut
    vous devez effectivement ajouter un bloc try/catch qui catch par exemple toutes les exceptions de type Exception (à éviter car c'est "sale" quand même).

    si vous regardez dans votre ancien code vous aviez bien deux bloc try/catch pour les Exception.

    normalement cela devrait fonctionner

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Points : 25
    Points
    25
    Par défaut
    en effet, sauf que eclipse me demandais de mettre chaque ligne dans un try, j'ai fai un gros try a la place et ça marche

    second problemme, le thread 1 se lance, puis ça plante lors de l'attente du client suivant, est ce que ça serait car j'utilise le meme port?

    et si je dois utiliser different port va falloir coder pas mal de truc quand meme, car il va falloir que je fasse une liste de port

    et que je la mette a jours cette liste a chaque connection/deconnection d'un client pour savoir lequels sont disponible ou occupé

    oui?

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    c'st autour de accept() que vous devez mettre votre boucle. La création de la serveurSocket, elle, elle se fait une fois pour toutes avant la boucle.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Mars 2006
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 53
    Points : 25
    Points
    25
    Par défaut
    ah, donc on peut gerer plusieur communication sur un socket =D

    oui, moi j'en creeais un nouveau pour chaque client, et j'etait parti pour faire ça :

    S>attente de connection sur un port generique
    C>demande de connection
    S>recherche d'un port libre et envoie de ce port au client
    S>attente de connection sur ce port
    C>demande de connection sur le port specifique
    S>lancement d'un thread

    -recommencer-

    je vais regarder comment fonctionne ce accept(), merci =D

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    oui et non


    un socket serveur, c'est un port et une ou plusieurs interfaces locale. Les clients se connectent dessus. A ce moment là la méthode accept() retourne un nouvel objet socket, qui est une socket client (server, port serveur, client, port client) sur lequel va se faire la communication. Donc de fait, tous les clients simultanés seconnectent sur le même port. Heureusement d'ailleurs, sinon ce serait le bordel à gérer des serveur web qui changent tout le temps d'adresse , ne serait-ce qu'au niveau des firewall.


    Bref le shéma classique est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    créer socket server
    binder socket server
    tant qu'on veux fonctionner
        socket-client = accept()
        traiter socket-client dans un thread à part
        fin tant que
    debrancher la socket serveur.

Discussions similaires

  1. Verrouillage d’enregistrement dans une application Client/server
    Par touhami dans le forum Connexion aux bases de données
    Réponses: 13
    Dernier message: 07/07/2008, 23h05
  2. Application client-server qui se kille toute seule
    Par Coussati dans le forum Web & réseau
    Réponses: 7
    Dernier message: 21/01/2008, 03h34
  3. Deploiement d'Application Client/Server avec SQL Server
    Par Parrain dans le forum Bases de données
    Réponses: 17
    Dernier message: 24/04/2007, 15h09
  4. Application client server avec delphi
    Par Mus_mus dans le forum Bases de données
    Réponses: 2
    Dernier message: 03/12/2006, 10h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo