Socket java client serveur

Résolu/Fermé
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012 - 9 mai 2012 à 23:41
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012 - 16 mai 2012 à 11:33
Bonjour, tout le monde j'ai un problème

je veux savoir si il y'a un moyen de créer un dossier et dans ce dossier un sous dossier, a partir du client dans la machine ou il y'a le serveur avec java .

je vous remercie.
A voir également:

34 réponses

valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
10 mai 2012 à 21:36
bon KX merci pour tout je pert espoir jai pas pu faire ce que je voulais le faite denvoyer un fichier avec jfilechooser et créer un dossier dune donnée de ma table sql

je voulais me basé sur le code que je tai envoyé parcequ'il enregistre le fichier et il créer un dossier mais il se bloque.


merci beaucoup KX.
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
10 mai 2012 à 22:04
le serveur que vous mavez donné se déconect a chaque fois qu'il fai une action je ne sais pas pourquoi
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
10 mai 2012 à 22:41
Ce n'est pas le serveur qui se déconnecte, c'est le client. C'était pour faire un exemple simple.
Dans mes deux main, on voit bien ce qui se passe, je créé 3 clients chacun faisant une action, et dans la boucle for du serveur on attend ces 3 clients...
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
11 mai 2012 à 01:06
Bonsoir KX jai réussi a créer un dossier et dans ce dossier un sous dossier le probléme c'est est ce qu'il ya un moyen d'envoyer des fichier evec jfilechooser utilisant objectoutputStream. Merci .
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
11 mai 2012 à 09:46
L'ObjectOutputStream c'est le Client qui doit le manipuler.
Si tu veux faire une action lié à un JFileChooser, tu dois créer un Client qui envoie le fichier puis s'arrête une fois l'action terminée pour libérer le Serveur.
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
11 mai 2012 à 10:41
merci KX
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
11 mai 2012 à 10:41
et au niveau du serveur pour récupérer le fichier et le mettre dans un dossier ya un moyen ? merci
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
11 mai 2012 à 10:48
Bien sûr, dans mon code, cela correspond au mode 1, et aux méthodes envoiFichier, je ne l'ai pas implémenté, mais si tu te bases sur les méthodes creationDossier que j'ai fait en entier ça devrait aller.
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
11 mai 2012 à 11:06
merci KX parceque dans ce code ce qui me dérange c le fileinputstream moi je veux enregistrer le fichier dans un dossier précis et ça veux pas marcher

 -->>  FileInputStream fis = new FileInputStream("t.tmp");
      ObjectInputStream ois = new ObjectInputStream(fis);

      int i = ois.readInt();
      String today = (String) ois.readObject();
      Date date = (Date) ois.readObject();


merci
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
11 mai 2012 à 11:08
j'ai remplacé le t.tmp par le chemin du dossier mais il me dise accés refusé
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
11 mai 2012 à 11:11
Les ObjectInputStream c'est pour la communication entre les sockets, pour la communication de fichier tu utilises un FileInputStream d'accord, mais mélanger les deux ça ne va plus !
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
11 mai 2012 à 11:17
mais il ya un message qui apparait il me dise comme quoi accés refusé au dossier voici mon code
Serveur
            server = new ServerSocket(1234);
	             while ( true ) {
	                 connection = server.accept();
	                 
	                 FileInputStream fis = new FileInputStream("c:\\dossier\\");
	                 ObjectInputStream ois = new ObjectInputStream(fis);

	                 int i = ois.readInt();
	                 if(i==1)
	                 {
	                 File today = (File) ois.readObject();
	                 //Date date = (Date) ois.readObject();
	                 }
	                 ois.close();
	 



Client
  JFileChooser selector = new JFileChooser();
	            selector.setDialogTitle("Selecciona el archivo a enviar");
	            int resultado = selector.showOpenDialog(null);
	            if (resultado == JFileChooser.APPROVE_OPTION)
	            {
	                archivo = selector.getSelectedFile();
	                direccionArchivo = archivo.getPath().toString();
	                
	            }
	            else{via.close();}
	            
	            
	            FileOutputStream fos = new FileOutputStream(direccionArchivo);
	            ObjectOutputStream oos = new ObjectOutputStream(fos);

	            oos.writeInt(1);
	            oos.writeObject(archivo.getName());
	           // oos.writeObject(new Date());

	            oos.close();



merci KX
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
11 mai 2012 à 12:01
Voici KX ce que tu ma demandé de faire jai suivi le méme principe que créerdossier
mais j'ai eu un message d'erreur
< java.util.regex.Pattern.SyntaxErrorException: llegal/unsuported escape sequence near index 3 c:\dossier\/gras>

voici le code

<gras>Serveur


  server = new ServerSocket(1234);
	             while ( true ) {
	                 connection = server.accept();
	                 ObjectInputStream input = new ObjectInputStream(connection.getInputStream());

	                 int i = input.readInt();
	                 
	                String dir = input.readUTF();
	                 String[] tab = dir.split("/c:\\dossier\\");
	                 File parent = root;
	                 for (String child : tab)
	                     parent = new File(parent,child);

	                 input.close(); 

	               


Client

	            JFileChooser selector = new JFileChooser();
	            selector.setDialogTitle("Selecciona el archivo a enviar");
	            int resultado = selector.showOpenDialog(null);
	            if (resultado == JFileChooser.APPROVE_OPTION)
	            {
	                archivo = selector.getSelectedFile();
	                direccionArchivo = archivo.getPath().toString();
	             
		          
	            }
	            else{via.close();}
	            ObjectOutputStream output = new ObjectOutputStream(via.getOutputStream());
	            
	            output.writeInt(3);
	            output.writeUTF(archivo.getName());
	            output.flush();


Merci beaucoup KX
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
11 mai 2012 à 12:22
Le split prend en paramètre une expression régulière, je ne vois pas ce que viens faire "c:\\dossier\\" là dedans, l'expression que j'avais marqué : "/\\\\" n'était a priori pas à modifier...
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
11 mai 2012 à 12:29
et comme je vais faire pour spécifier le dossier ou va arriver le fichier?
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
11 mai 2012 à 12:35
Avec le string dir ça ira, celui-ci contient un chemin relatif (exemple : "toto/tata/titi.txt"), que le split("/\\\\") va décomposer en String[] { "toto", "tata", "titi.txt" }, de sorte que la petite boucle for permette de se déplacer de la racine (File root) et construire l'objet File correspondant.
Si C:\\dossier est ta racine alors il faut modifier File root = new File("C:\\dossier\\");
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
11 mai 2012 à 13:03
merci KX pour ta réponse jai essayé mais ça na pas marché je ne reçois rien
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
11 mai 2012 à 13:05
j'ai mis ça au niveau du serveur

  String dir = input.readUTF();
	            
	                 File root = new File("C:\\dossier\\");
	           
	                 input.close(); 



merci
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
11 mai 2012 à 22:19
Bonsoir KX jai réussi a créer les dossier envoyer des fichier le probléme que j'ai c'est que il envoi un nombre de fichier apré un moment il se bloque et il me dise

java.net.SocketException:Connection reset by peer:Socket Write Error

voici le code

Client

      try
	      {
	         // IP = JOptionPane.showInputDialog(null,"Entrez Lip du pc distant","Cliente",JOptionPane.CANCEL_OPTION);
	          Socket via = new Socket(IP, 1234);
	          if(via.isConnected())
	          {
	            JOptionPane.showMessageDialog(null, "Conectado al servidor: " + IP);
	        
	 
	            JFileChooser selector = new JFileChooser();
	            selector.setDialogTitle("Selecciona el archivo a enviar");
	            int resultado = selector.showOpenDialog(null);
	            if (resultado == JFileChooser.APPROVE_OPTION)
	            {
	                archivo = selector.getSelectedFile();
	                direccionArchivo = archivo.getPath().toString();
	            }else{via.close();}
	 int i1=1;
	            BufferedInputStream bis = new BufferedInputStream(new FileInputStream(direccionArchivo));
	            BufferedOutputStream bos = new BufferedOutputStream(via.getOutputStream());
	 
	            //Enviamos el nombre del archivo
	            DataOutputStream dos = new DataOutputStream(via.getOutputStream());
	            dos.writeUTF(archivo.getName());
	            dos.writeUTF(s);
	            dos.writeUTF(s1);
	            dos.writeInt(i1);
	            
	 
	            byteArray = new byte[8192];
	            while ((in = bis.read(byteArray)) != -1)
	            {
	                bos.write(byteArray,0,in);
	            }
	          
	 bis.close();
	bos.close();
	dos.close();
	 


Serveur


         try{
             server = new ServerSocket(1234);
             while ( true ) {
                 connection = server.accept();
 
                 receivedData = new byte[8192];
                 bis = new BufferedInputStream(connection.getInputStream());
                 DataInputStream dis = new DataInputStream(connection.getInputStream());
 
                 //recibimos el nombre del fichero
                 file = dis.readUTF();
                 file1 = dis.readUTF();
                 file2=dis.readUTF();
                int i=dis.readInt();
                
                 file = file.substring(file.indexOf('\\')+1,file.length());
                 if(i==1)
                 {
                 //aqui se escribe el archivo en la ubicacion donde este el Servidor.jar
                 bos = new BufferedOutputStream(new FileOutputStream("C:\\ireg\\"+file1+"\\"+file2+"\\"+ file));
             
                 while ((in = bis.read(receivedData)) != -1){
                     bos.write(receivedData,0,in);
                     bos.close();
                 }}else{System.exit(0);}
                
               
                 
                 dis.close();
                 bis.close();


Merci beaucoup KX!
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
12 mai 2012 à 14:58
C'est exaspérant de voir que tu ne réutilises pas du tout le code que j'ai pu te donner (et qui marche), parce que tu préfères reprendre ton code bogué et le modifié sur le tas en espérant qu'à un moment il y aura un miracle et que tout rentrera dans l'ordre !

Il me semble bien avoir dit (ici) qu'il ne fallait pas fermer la socket, or toi qu'est-ce que tu fais ?

dis.close();
bis.close();

De plus, avec ta manie de tout fermer j'imagine que ce genre de code va pas faire ce que tu veux pour des fichiers plus grand que la taille de ton buffer :

while ((in = bis.read(receivedData)) != -1){
    bos.write(receivedData,0,in);
    bos.close();
}
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
12 mai 2012 à 15:07
Bonjour KX merci pour ta réponse je me suis basé sur ton serveur et j'ai fai ce serveur le voilà il marche trés bien avec un seul client mais quand un nouveau utilisateur s'ajoute les fichier n'arrive plus et il se plante voici le code merci.

Serveur


public class Servidor
    implements Runnable
{

    ServerSocket server;
    Socket connection;
    DataOutputStream output;
    BufferedInputStream bis;
    BufferedOutputStream bos;
    byte receivedData[];
    int in;
    String file;
    String file1;
    String file2;



    public Servidor()
    {
        connection = null;
        try
        {
            server = new ServerSocket(1234);
            System.out.println("serveur");
        }
        catch(Exception e)
        {
            System.out.println((new StringBuilder("erreur serveurn")).append(e).toString());
            System.exit(1);
        }
    }

    public void run()
    {
        Socket client = null;
        do
        {
            do
            {
                if(server == null)
                {
                    return;
                }
                try
                {
                    client = server.accept();
                    System.out.println("nouveau client");
                }
                catch(IOException e)
                {
                    System.err.println((new StringBuilder("connexion impossible")).append(e.getMessage()).toString());
                }
            } while(server == null);
            try
            {
                InputStream in = client.getInputStream();
                DataInputStream dis = new DataInputStream(client.getInputStream());
                file = dis.readUTF();
                file1 = dis.readUTF();
                file2=dis.readUTF();
                int i=dis.readInt();
                if(i==1)
                { 

          	     File directorio = new File("c:\\dossier\\"+file1+"\\"+file2+"\\"); 
                directorio.mkdir();
                }
                if(file != null)
                {
                	  bos = new BufferedOutputStream(new FileOutputStream("C:\\dossier\\"+file1+"\\"+file2+"\\"+ file));
                    byte buf[] = new byte[1024];
                    int len;
                    while((len = in.read(buf)) > 0) 
                    {
                        bos.write(buf, 0, len);
                    }
                  //  in.close();
                    bos.close();
                }
            }
            catch(IOException e)
            {
                System.out.println((new StringBuilder("Error: ")).append(e).toString());
            }
        } while(true);
    }

    public static void main(String a[])
    {
        Servidor servidor = new Servidor();
        (new Thread(servidor)).start();
    }
}


0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
12 mai 2012 à 19:32
Je ne vois vraiment pas en quoi ce programme est basé sur le mien !
En tout cas, au niveau de la manière de programmer tu en es très loin, te revoilà avec un code monolithique mélangeant tout au même endroit, très difficile à lire et donc à déboguer !

Ce que tu fais c'est une classe implements Runnable, et ensuite un new Thread(serveur), mais cela ne créé qu'un seul thread ! Si tu veux que ton serveur créé un nouveau thread à chaque nouveau client, alors le nouveau thread doit intervenir après le client = server.accept(); de sorte que le thread principal revienne immédiatement sur cette instruction pour accepter les clients suivants...
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
12 mai 2012 à 22:39
Bonsoir KX merci de m'aider j'ai fais un serveur presque comme celui que vous maviez donner le probléme c'est qu'il marche 3fois et avec un seul clientquand il ya un autre client qui arrive il plante voici le code merci beaucoups.
Serveur

public class bokal 
{   
    private final ServerSocket srv;
    private final File root;
    String file ;
    String file1 ;
    String file2 ;
    InputStream in ;
    DataInputStream dis;
    
    public bokal(File root, int port) throws IOException
    {
        srv = new ServerSocket(port);
        this.root = root;
    }
    
    public void close() throws IOException
    {
        srv.close();
    }
    
    public void service() throws IOException
    {
        Socket clt = srv.accept();
        if(srv == null)
        {
            return;
        }
        in = clt.getInputStream();
        dis = new DataInputStream(clt.getInputStream());
        
     
     
		
       
        file = dis.readUTF();
      file1 = dis.readUTF();
      file2 = dis.readUTF();
        int i=dis.readInt();
if(i==1)
	
{creationDossier(in);

}
if(file != null)
{
	  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\IREG\\"+file1+"\\"+file2+"\\"+ file));
    byte buf[] = new byte[1024];
    int len;
    while((len = in.read(buf)) > 0) 
    {
        bos.write(buf, 0, len);
    }
    in.close();   
}

    }

    public boolean envoiFichier(ObjectInputStream input, ObjectOutputStream output) throws IOException
    {
        //TODO
     //   envoiConfirmation(output,false,"Mode non implémenté.");
        return false;
    }
    
    public boolean receptionFichier(InputStream in) throws IOException
    {
    	  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\dossier\\"+file1+"\\"+file2+"\\"+ file));
          byte buf[] = new byte[1024];
          int len;
          while((len = in.read(buf)) > 0) 
          {
              bos.write(buf, 0, len);
          }
        return false;
    }
    
    public boolean creationDossier(InputStream in) throws IOException
    {
        File directorio = new File("c:\\dossier\\"+file1+"\\"+file2+"\\"); 
        directorio.mkdirs();

      
        //    envoiConfirmation(output,false,e.toString());
            return false;
        
    }
    
    public static void main(String...args) throws IOException
    {
    bokal s = new bokal(new File(""),1234);
  

        for (int i=1; i<=3; i++)
            s.service();
        
      //  s.close();
    }

}



merci beaucoup.
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
12 mai 2012 à 22:40
je n'ai pas utilisé objectoutputstream parceque je n'ai pas su comment envoyer les fichier merci
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
12 mai 2012 à 22:49
Il marche trois fois parce que dans le main il y a une boucle for qui fait 3 fois appel à service()
Il vaudrait mieux faire une boucle while(true). Cependant, mon code ne permettait pas de gérer plusieurs services en même temps, il faisait des services courts puisque chaque opération était créée par un client "différent".

Si tu veux faire un serveur véritablement multi-thread il faudra faire un peu différemment, je pense à quelque chose comme ça (je reprends mon code, mais j'ai pas testé) :

public void service() throws IOException
{
    while (true)
    {
        final Socket clt = srv.accept();

        new Thread()
        {
            @Override
            public void run()
            {
                ObjectOutputStream output = new ObjectOutputStream(clt.getOutputStream());
                ObjectInputStream input = new ObjectInputStream(clt.getInputStream());

                int mode = input.readInt();
                
                switch (mode)
                {
                    case 1 : 
                        envoiFichier(input,output); 
                        break;
                    case 2 :
                            receptionFichier(input,output);
                            break;
                    case 3 : 
                            creationDossier(input,output); 
                            break;
                    default : 
                            envoiConfirmation(output,false,"Mode non reconnu.");
                }
        
                input.close();
                output.close();
        }.start();
    }
}
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
12 mai 2012 à 23:18
Merci KX pour ta réponse ça me donne erreur a ce niveau





public class bokal 
{   
    private final ServerSocket srv;
    private final File root;
    String file ;
    String file1 ;
    String file2 ;
    InputStream in ;
    DataInputStream dis;
    
    public bokal(File root, int port) throws IOException
    {
        srv = new ServerSocket(port);
        this.root = root;
    }
    
    public void close() throws IOException
    {
        srv.close();
    }
    
    public void service() throws IOException
    {while(true)
    {
    	
    	 
        final Socket clt = srv.accept();
        new Thread()
        {
            @Override
            public void run()
            {
        if(srv == null)
        {
            return;
        }
        in = clt.getInputStream();
        dis = new DataInputStream(clt.getInputStream());
        
     
     
		
       
        file = dis.readUTF();
      file1 = dis.readUTF();
      file2 = dis.readUTF();
        int i=dis.readInt();
if(i==1)
	
{creationDossier(in);

}
if(file != null)
{
	  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\IREG\\"+file1+"\\"+file2+"\\"+ file));
    byte buf[] = new byte[1024];
    int len;
    while((len = in.read(buf)) > 0) 
    {
        bos.write(buf, 0, len);
    }
}
    in.close();   
       ----------->>>             } }.start();
    }



merci beaucoups.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
12 mai 2012 à 23:28
Ce serait bien de dire c'est quoi comme erreur !
Là comme ça je ne vois pas ce qui coince, toutes les accolades et parenthèses sont bien fermées.
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
12 mai 2012 à 23:32
il disent comme quoi il manque un point virgule mais ils sont tous bien mis en place :s
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
12 mai 2012 à 23:43
Il te manque deux accolades à la fin pour fermer la méthode service() et la classe bokal, c'est peut-être juste une erreur de copier-coller sur le forum, mais ce serait bien de vérifier.
Plus embêtant, tu n'as aucun try/catch sur tes IOException, alors que la méthode run de Thread ne peut propager aucune exception !
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
13 mai 2012 à 00:28
merci KX pour ta réponse.
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
13 mai 2012 à 17:13
bonjour KX je voulais savoir pour les serveur multithread est ce que le jdk doit etre le meme sur tout les pc parceque ca marche d'un pc vers le serveur mais pour un autre pc ca bloque une fois jai changer le jdk ça a bloqué pour tous les deux merci.
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
13 mai 2012 à 20:52
Bonjour KX jenvoi un entier pour qu'il active la suppresion mais ca marche pas voici mon code

Serveur

<
 public void supprimer(DataInputStream dis)
 
 {
	 
	  File directorio = new File("C:\\Idossier\\"+file1+"\\"+file2+"\\"+ file);
     directorio.delete();
 }
  public void run()
  {
    String message = ""; // déclaration de la variable qui recevra les messages du client
    // on indique dans la console la connection d'un nouveau client
    System.out.println("Un nouveau client s'est connecte, no "+_numClient);
    try
    {
    	 InputStream in =_s.getInputStream();
    	 
         DataInputStream dis = new DataInputStream(_s.getInputStream());
         file = dis.readUTF();
         file1 = dis.readUTF();
         file2 = dis.readUTF();
         i=dis.readInt();
         switch (i)
         {
         case 2 : 
            supprimer(dis); 
             break;
        
       }
/code>


Client

<code>public  void supprimer()
	{
	  
	      int in;
	    
	      String direccionArchivo = null;
	      String IP = "127.0.0.1";
	      int i=0;
	      try
	      {
	         
	          Socket via = new Socket(IP, 1234);
	          if(via.isConnected())
	          {
	           
	        	  JOptionPane.showMessageDialog(null, "Conectado al servidor: " + IP);
	            //Enviamos el nombre del archivo
	            DataOutputStream dos = new DataOutputStream(via.getOutputStream());
	         
	            dos.writeUTF(s);
	           dos.writeUTF(s1);
	           
	            dos.writeInt(2);
	            
	
	

	 
	        }
	 
	      }catch (Exception e) {//JOptionPane.showMessageDialog(null,e,"Error",JOptionPane.ERROR_MESSAGE);
	    	  }

	      }


Merci beaucoups.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 13/05/2012 à 22:52
Je ne sais pas si tu as regardé la documentation de delete(), mais le dossier doit être vide pour pouvoir être effacé, ce qui pourrait expliquer pourquoi cela ne fonctionne pas.
Une autre chose marqué dans la javadoc c'est que l'on peut utiliser la méthode de la classe Files pour avoir des informations plus précises lorsque la suppression a échouée, via différentes Exceptions qu'il faudra distinguer pour savoir quoi faire dans tel ou tel cas...

Attention : la classe Files et les exceptions associées sont nouvelles de la JDK 7, tu ne pourras donc pas diminuer la version pour la compatibilité des anciennes JRE comme on a pu le faire tout à l'heure...

public static boolean delete(File toDelete)
{
	try
	{
		java.nio.file.Files.delete(toDelete.toPath());
		return true;
	}
	catch (java.nio.file.NoSuchFileException e)
	{
		System.err.println(e);
		return true;
	}
	catch (java.nio.file.DirectoryNotEmptyException e)
	{
		System.err.println(e);
		return false;
	}
	catch (IOException e)
	{
		System.err.println(e);
		return false;
	}
	catch (SecurityException e)
	{
		System.err.println(e);
		return false;
	}
	catch (Exception e)
	{
		System.err.println(e);
		return false;
	}
}
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
14 mai 2012 à 00:15
merci KX voila jai réussi à supprimer le dossier méme avec les fichier mais le probléme c'est qui n'effectue pas la condition pour appelé la fonction.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
14 mai 2012 à 00:25
"la condition pour appelé la fonction", quelle condition ? quel appel ? quelle fonction ?
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
14 mai 2012 à 10:40
Bonjour KX la condition du swith ici sur le serveur

Serveur

 public void supprimer(DataInputStream dis)
 
 {
	 
	  File directorio = new File("C:\\Idossier\\"+file1+"\\"+file2+"\\"+ file);
     directorio.delete();
 }
  public void run()
  {
    String message = ""; // déclaration de la variable qui recevra les messages du client
    // on indique dans la console la connection d'un nouveau client
    System.out.println("Un nouveau client s'est connecte, no "+_numClient);
    try
    {
    	 InputStream in =_s.getInputStream();
    	 
         DataInputStream dis = new DataInputStream(_s.getInputStream());
         file = dis.readUTF();
         file1 = dis.readUTF();
         file2 = dis.readUTF();
         i=dis.readInt();
         switch (i)
         {
         case 2 : 
            supprimer(dis); 
             break;
        
       }



quand il reçoit 2 il neffectue pas l'opération merci.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
14 mai 2012 à 11:35
Essaye comme ceci (au moins le temps de déboguer)

public void supprimer()
{
    File directorio = new File("C:\\Idossier\\"+file1+"\\"+file2+"\\"+ file);
    System.out.println(directorio.getAbsolutePath());
    boolean b = delete(directorio); // la méthode delete que j'ai définie ici
    System.out.println(b);
}

public void run()
{
    String message = ""; // un StringBuffer ce serait mieux non ?

    // on indique dans la console la connexion d'un nouveau client
    System.out.println("Un nouveau client s'est connecte, no "+_numClient);

    try
    {
        InputStream in = _s.getInputStream(); // un nom de variable ne devrait pas commencer par _
        DataInputStream dis = new DataInputStream(_s.getInputStream());

        file = dis.readUTF();
        file1 = dis.readUTF();
        file2 = dis.readUTF();

        i=dis.readInt();
        System.out.println(i);

        switch (i)
        {
        case 2 : 
            supprimer(); // inutile de passer dis en paramètre, il n'est pas utilisé 
            break;
       }
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
14 mai 2012 à 17:11
merci KX j'ai un autre soucis les fichiers excel arrive deformé quand je les ouvres je trouves des codes .
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 14/05/2012 à 18:06
"je trouves des codes", mais encore ?

Un des problème possible d'une mauvaise transmission c'est l'encodage, tu utilises des readUTF et writeUTF qui sont a-priori des méthodes pour manipuler du texte, alors qu'un fichier Excel est un fichier binaire, il vaudrait donc mieux utiliser les méthode read(byte[]) et write(byte[])...
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
14 mai 2012 à 18:11
je supose que c'est un probléme du a lenvoi du fichier et a la récéption voici le serveur et le client merci beaucoup.


Serveur
    public void run()
    {
        try
        {
            InputStream in = socket.getInputStream();
            DataInputStream dis = new DataInputStream(socket.getInputStream());
            String file = dis.readUTF();
            String file1 = dis.readUTF();
            String file2 = dis.readUTF();
            int i = dis.readInt();
            if(i == 1)
            {
                File directorio = new File("c:\\dossier\\"+file1+"\\"+file2+"\\"); 
                directorio.mkdirs();
            }
            if(file != null)
            {
                BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\Idossier\\"+file1+"\\"+file2+"\\"+ file));
                byte buf[] = new byte[131072];
                int len;
                while((len = in.read(buf)) > 0 ) 
                {
                    bos.write(buf, 0, len);
                }
            }
        }



Client


  BufferedInputStream bis = new BufferedInputStream(new FileInputStream(direccionArchivo));
	            BufferedOutputStream bos = new BufferedOutputStream(via.getOutputStream());
	 
	            //Enviamos el nombre del archivo
	            DataOutputStream dos = new DataOutputStream(via.getOutputStream());
	            dos.writeUTF(archivo.getName());
	            dos.writeUTF(s);
	            dos.writeUTF(s1);
	             dos.writeInt(1);
	      //  dos.writeInt(2);
	            
	 
	            byteArray = new byte[131072];
	            while ((in = bis.read(byteArray)) != -1)
	            {
	                bos.write(byteArray,0,in);
	            }


merci beaucoups.
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
14 mai 2012 à 18:43
Comme ça je vois deux "détails" qui pourraient poser problème.

Dans Serveur, ta boucle while continue tant que len>0, or il est possible qu'à un moment donné on n'envoie rien (parce que le réseau est saturé par exemple) donc on a len==0, mais qu'à l'étape d'après on puisse continuer malgré tout l'envoi de données, or tu auras coupé ta boucle trop tôt et tu n'auras pas la fin du message ! Seul le cas len == -1 permet de s'assurer que la transmission est terminée.

Dans les deux codes, tu utilises 128 Kio pour ton buffer de données, je me demande si ce n'est pas un peu trop (surtout combiné à la première erreur), il faudrait que tu prennes une taille beaucoup plus modeste (1Kio suffira) pour vérifier que ce n'est pas cette taille qui pose problème...
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
16 mai 2012 à 00:24
Bonsoir KX voila j'ai essayé mais rien voici mon code merci

Serveur
	  public void run() {
	        try {
	        	
	        	 BufferedInputStream bis = new BufferedInputStream(_s.getInputStream());
	             DataInputStream dis = new DataInputStream(_s.getInputStream());
	             int i=dis.readInt();
	             file = dis.readUTF();
	             file1 = dis.readUTF();
	             file2 = dis.readUTF();
	             File directorio = new File("c:\\IREG\\"+file1+"\\"+file2+"\\"); 
	             directorio.mkdirs();
	           
	             
	          
	            	// File directorio = new File("c:\\ireg\\"+file1+"\\"+file2+"\\"); 
	              //   directorio.delete();
	             
	             switch(i){
	             
	             case 1 : File directorio1 = new File("C:\\dossier\\"+file1+"\\"+file2+"\\");
	             SupprRep(directorio1);
	             
	             break;
	             
	             case 2 : creerdossier(file,file1,file2); 
	             
	             break;
	             }
	       	  
	           //  File directorio = new File("c:\\dossier\\"+file1+"\\"+file2+"\\"); 
	           //  directorio.delete();}
	             if(file != null)
	             {
	             	  BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("C:\\dossier\\"+file1+"\\"+file2+"\\"+ file));
	                 byte buf[] = new byte[1024];
	                 int len;
	                 while((len = bis.read(buf))>=0) 
	                 {
	                     bos.write(buf, 0, len);
	                 }
	               bis.close();
	               bos.close();
	             }
	        }

Client

public  void Client()
{
  
    
      String IP = null;
      int i=0;
      try
      {
          IP = JOptionPane.showInputDialog(null,"Entrez Lip du pc distant","Client",JOptionPane.CANCEL_OPTION);
          Socket via = new Socket(IP, 1234);
          if(via.isConnected())
          {
            JOptionPane.showMessageDialog(null, "Conectado al servidor: " + IP);
      
 
            //Enviamos el nombre del archivo
            DataOutputStream dos = new DataOutputStream(via.getOutputStream());
          //  dos.writeUTF(archivo.getName());
            dos.writeUTF(s);
            dos.writeUTF(s1);
          dos.writeInt(2);
 //  dos.writeInt(1);
            
 
}
 via.close();        
 


merci beaucoups.
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
16 mai 2012 à 00:26
et si j'écris le code avec le jfilechooser le int passe et la commande est executé sur le serveur je ne sais pas pourquoi merci.
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
16 mai 2012 à 01:57
c'est bon KX merci j'ai régler le probléme , il me reste un seul soucis c'est appelé une fonction qui se trouve dans une autre classe et l'utiliser dans la classe que je veux y'a t'il un moyen? merci
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
16 mai 2012 à 09:10
Si la méthode est public, il suffit de créer un objet de cette classe et de l'appeller, si la méthode est static c'est encore plus simple, on n'a pas besoin de créer l'objet !
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
16 mai 2012 à 11:33
Merci KX ça marche trés bien !
0
valour1234 Messages postés 67 Date d'inscription mardi 8 mai 2012 Statut Membre Dernière intervention 18 mai 2012
16 mai 2012 à 11:33
merci pour ton aide!
0