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

avec Java Discussion :

Amélioré un serveur multithread


Sujet :

avec Java

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 172
    Points : 85
    Points
    85
    Par défaut Amélioré un serveur multithread
    Bonjour,

    code coté serveur :
    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
    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
     
    class ClientWorker implements Runnable 
    {
      private Socket client;
     
     
      ClientWorker(Socket client)       
      {
       this.client = client; 
      }
     
      public synchronized void run()
      {
        String line;
        BufferedReader in = null;
        PrintWriter out = null;
        try
        {
          in = new BufferedReader(new InputStreamReader(client.getInputStream()));
          out = new PrintWriter(client.getOutputStream(), true);
        } catch (IOException e) 
          {
          System.out.println("erreur lecture");
          System.exit(-1);
          }
     
        while(true)
        {
          try
          {
             line = in.readLine(); 
             System.out.println("le serveur a recu   "+line);
             out.println(line);      //accuser de reception     
     
     
     
           } catch (IOException e) 
             {
             System.out.println("erreur de lecture");
             System.exit(-1);
            }
        }
      }
     
    }// End ClientWorker class
     
    class SocketServer extends JFrame
    {
     
       ServerSocket server = null;
     
        SocketServer() //Begin Constructor
        { 
         //  construction de la fenetre 
        } //End Constructor
     
      public void listenSocket()
      {
     
          try
          {    	  
           server = new ServerSocket(4444); 
     
          }catch (IOException e) 
          {
          System.out.println("probleme port 4444");
          System.exit(-1);
          }
          while(true)
          {   	 
              ClientWorker w;
             try
             {
               w = new ClientWorker(server.accept());  
               Thread t = new Thread(w);         
               t.start();         
              } 
             catch (IOException e) 
             {
              System.out.println("Accept failed: 4444");
              System.exit(-1);
              }
         }
      }
     
      protected void finalize()   
      {                           
     
         try{
              server.close();
            }catch (IOException e) 
             {
              System.out.println("probleme fermeture socket");
              System.exit(-1);
             }
      }
     
      public static void main(String[] args)
      {	 	  
          SocketServer frame = new SocketServer();
    	  frame.setTitle("Server Multi threads Program");
            WindowListener l = new WindowAdapter() {
                    public void windowClosing(WindowEvent e) {
                            System.exit(0);
                    }
            };
            frame.addWindowListener(l);
            frame.pack();
            frame.setVisible(true);
     
     
            frame.listenSocket(); ////////// very important this code !
     
      }
     
     
     
    }//////////////////////// End  SocketServer class
    ce code de serveur fonctionne et il arrive a acceuillir plusieur clients sur le port 4444 (je simule sur la même machine serveurs/clients) et afin d'amelioré mon serveur voici mes questions :

    1- dans le cas ou je veux que mon serveur et ces clients soient connectés en permanence est-ce que je dois fermer les flux aprés chaque message envoyé par un client. car en simulant ce code de la méthode "protected void finalize() " qui s'occupe de fermer les flux n'est pas utilisé par le programme ? pourquoi ça? on dirait elle ne sert à rien.!!!

    2- comment je peut s'avoir que un client vient de se connécté au serveur et avoir le non de ce dernier bref avoir une vision sur mes client si il sont connéctés. j'ai pensé à utiliser la classe InetAddress pour avoir des information sur les clients connectés mais comment. sachant que je simule mon application serveur/clientS sur la même machine sous Eclipse.

    3- si y a code similaire à se que je veux sa serai sympa de me le montré pour avoir une idée.

    4- si y a des corrections à apporter sur mon code n'hésitez pas à me le signaler

    Merci d'avance de m'avoir idée à ameliorer mon code serveurs.

    A+

  2. #2
    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
    1. Ben non, tu ferme quand t'as fini, pas entre chaque message.
    1. La méthode finalize est appelée au bon vouloir du garbage collector quand et si il collecte ton instance. A éviter
    2. Juste après ton accept(), t'as qu'a faire tout la popotte que t'as envie pour avoir les infos sur le clients (est-ce qu'il te les passe, est-ce que tu te contente de l'ip, etc a toi de voir)

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 172
    Points : 85
    Points
    85
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    1. Ben non, tu ferme quand t'as fini, pas entre chaque message.
    Bonjour,
    d'abord merci pour cette réponse ..
    quaud j'ai dis que les clients et le serveur doivent etre connecté en PERMANENCE je suppose que on ferme jamais ?


    Citation Envoyé par tchize_ Voir le message
    1. La méthode finalize est appelée au bon vouloir du garbage collector quand et si il collecte ton instance. A éviter
    j'ai pas bien saisi tu peux dévlopper un peu ce point là ... sinon comment remedier tu peux me proposer une solution meilleur .


    Citation Envoyé par tchize_ Voir le message
    2. Juste après ton accept(), t'as qu'a faire tout la popotte que t'as envie pour avoir les infos sur le clients (est-ce qu'il te les passe, est-ce que tu te contente de l'ip, etc a toi de voir)
    comment je dois faire ça ..surtout que je simule mon application sur la meme machine donc l'IP ne tioen pas la route ...si tu as quelques chose à me proposer un exemple un code ...ect merci d'avance
    A

  4. #4
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    Salut,

    1) Sache que tu peux fermer et ouvrir les flux tant que tu veux, c'est si tu fermes ton Socket, tu perds la connections de ton client.

    En fait voilà, le mieux(pour moi) s'est de créer une petite classe client côtés serveur où tu lui mes le Socket du client avec input ,output et d'autre info si tu veux. Et aussi une fonction close. Donc à chaque Client connecter tu te crées une nouvelle classe Client que tu gardes dans une liste par exemple.

    Si tu appelles ta fonction Finalize, tu perds tous, mais les flux reste ouvert...tu sais juste plus accepté de Client... Le mieux est de fermer tous tes clients puis ton serveur sinon c'est pas propre.

    2. Alors garde-les dans une Liste et affiche là de temps en temps ou affiche quelques choses quand un new client se connecte...

    Ensuite je pense que tu veux savoir comment savoir qu'un client est toujours connecté : il y a plusieurs débats sur le net et même sur ce forum je pense.... Il y a pas de bonne méthode... il faut bien gérer ses exceptions et sinon Soit le Client envoie un message tous les X temps au serveur ou alors le serveur fait une requête au Client comme un ping par exemple pour voir si il répond.

  5. #5
    Membre régulier
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    133
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2012
    Messages : 133
    Points : 122
    Points
    122
    Par défaut
    Citation Envoyé par zpico Voir le message
    Bonjour,
    d'abord merci pour cette réponse ..
    quaud j'ai dis que les clients et le serveur doivent etre connecté en PERMANENCE je suppose que on ferme jamais ?

    Le Socket en tous cas, sinon tu perds la connections entre client et serveur



    j'ai pas bien saisi tu peux dévlopper un peu ce point là ... sinon comment remedier tu peux me proposer une solution meilleur .

    LA fonction finalize est gèrée par le Garbage Collector, c'est celui qui nettoie les zones mémoires de ce qu'on a oublié de fermer. Le mieux est que tu gères le plus possible les fermetures de flux que tu as ouvert comme les Sockets par exemple quand tu n'as plus besoin.



    comment je dois faire ça ..surtout que je simule mon application sur la meme machine donc l'IP ne tioen pas la route ...si tu as quelques chose à me proposer un exemple un code ...ect merci d'avance

    Je pense qu'il parle d'échanger des messages entre le serveur et le client. Dés que ton client reçoit l'info qu'il a été accepté par ton serveur, il peut lui envoyer des messages comme par exemple son nom ou autres choses...

  6. #6
    Membre régulier
    Inscrit en
    Décembre 2010
    Messages
    172
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 172
    Points : 85
    Points
    85
    Par défaut
    Bonjour,

    merci pour ces idées interessates je vais essayer tout ça et je vais voir le résultat.

    A+

Discussions similaires

  1. Arrêt d'un serveur multithread
    Par bambou dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 07/07/2010, 16h04
  2. conception serveur multithread
    Par nivose110 dans le forum Réseau
    Réponses: 12
    Dernier message: 17/07/2006, 16h43
  3. Question Serveur Multithread
    Par Mr_Chut dans le forum Réseau
    Réponses: 10
    Dernier message: 09/06/2006, 17h27
  4. Réponses: 5
    Dernier message: 11/01/2006, 07h58

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