Socket avec un serveur et 2 client !!

Fermé
sourire05 Messages postés 6 Date d'inscription vendredi 28 décembre 2012 Statut Membre Dernière intervention 7 février 2014 - Modifié par sourire05 le 28/11/2013 à 18:04
Bonjour,

Je voulait crée un programme qui permet de communiquer entre un serveur et 2 client.
les 2 client envoi un tableau au serveur, ce dernier reçoit les 2 tableau et les trie
en un seul tableau et le renvoi pour les 2 client .
mon problème c'est la synchronisation des thread au niveau de serveur , pour soit
le thread 1 attend le thread 2 pour trie les 2 tableau et envoi le résultat pour les 2 client.


//Cote serveur
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Server
{
       public static void main(String[] zero) throws InterruptedException
       {
               ServerSocket socket;
               
         
               try {
                        socket = new ServerSocket(2478);
                        //creé le thread  
                        Thread t = new Thread(new Accepter_clients(socket));
                        t.start();
                        System.out.println("Mes employeurs sont prêts !");
                   } 
               
               catch (IOException e) 
                   {
                        e.printStackTrace();
                   }
       }
}


class Accepter_clients implements Runnable 
{
           private ServerSocket socketserver;
           private Socket socket;
           private int nbrclient = 1;
           private Boolean etat=Boolean.FALSE;
           ObjectOutputStream out;
        ObjectInputStream in ;
        int []  tableauAEmettre ;
        List<Object> liste = new ArrayList<Object>();
           public Accepter_clients(ServerSocket s)
           {
           socketserver = s;
           }

public synchronized void run() //pour un seul thread à la fois
{
       try {
            while(true)
            {
                socket = socketserver.accept(); // Un client se connecte onl'accepte
                System.out.println("Le client numéro "+nbrclient+" est connecté !");
                nbrclient++;
             
             // lire le tableau reçoi
             
          in = new ObjectInputStream(socket.getInputStream());
          Object objetRecu= in.readObject();
          tableauAEmettre= (int[]) objetRecu;
          
          for( int i=0;i<tableauAEmettre.length;i++){
           liste.add(tableauAEmettre[i]);
          
             }
          // List<Object> table=tri(liste);
          //System.out.println("serveur recoit: " + table);
             System.out.println("serveur recoit: " + liste);
                
             if(!etat){
              etat= Boolean.TRUE;
              wait();// pour attend le thread 2
             }
             else{
              notify();//débloquer le thread 
             }
              
               
              List<Object> tabl=tri(liste);
             
             
                out = new ObjectOutputStream(socket.getOutputStream());
                   out.flush();
                out.writeObject(tabl);
                   out.flush();
                
                 System.out.println("serveur envoi: " + tabl);
              
             out.close();
             in.close();
             socket.close();
             }
            
           
      //socketserveur.close();
      
           }
       catch (IOException e)
           {
                e.printStackTrace();
           } 
       catch (ClassNotFoundException e) {
  // TODO Auto-generated catch block
         e.printStackTrace();
        } 
       catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
       }

//Fonction permet de trie les tableau
public static List<Object> tri(List<Object> tab) 
{
   
   for(int i=0;i<tab.size()-1;i++)
   {
    int min=i; 
    for (int j=i+1; j<tab.size(); j++)
    {     
     if ((int)tab.get(j)<(int)tab.get(min))
            {
                min=j;
            }
    }
    
    int AIDE;
         AIDE=(int)tab.get(i);
         tab.set(i,(int)tab.get(min));
         tab.set(min,AIDE);
   }
   return (tab) ;
  } 

}


// Cote client1.java et client2.java
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.*;
import java.util.Arrays;

public class Client {
 
 public static void main(String[] zero) throws ClassNotFoundException{
 
  Socket socket;
  ObjectInputStream in;
  ObjectOutputStream out ;

  try {
                socket = new Socket("localhost",2478);
                 
                out = new ObjectOutputStream(socket.getOutputStream());
        out.flush();
         
        int lower = 3;
        int higher = 15;

        int random = (int)(Math.random() * (higher-lower)) + lower;
                 int[] tableauAEmettre= new int[random];
                 
        for (int i=0;i<random;i++)
        {
         tableauAEmettre[i]=(int)(Math.random() * (40-0)) + 0;
        }
        
        out.writeObject(tableauAEmettre);
           out.flush();
           System.out.println("Client 1 envoi: " + Arrays.toString(tableauAEmettre));
           
         in = new ObjectInputStream(socket.getInputStream());
         Object objetRecu = in.readObject();
            int[] tableauRecu = (int[]) objetRecu;
            System.out.println("Client 1 recoit: " + Arrays.toString(tableauRecu));
            
            in.close();
            out.close();
         socket.close();
                 socket.close();

      } 
  catch (IOException e) 
     {
                 e.printStackTrace();
           }
     }
}