Socket java client serveur

Résolu
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.

34 réponses

Résumé de la discussion

La demande porte sur la création d’un dossier puis d’un sous-dossier via Java, à réaliser soit côté client soit côté serveur lors d’un échange réseau. Plusieurs éléments évoqués décrivent des approches liées au transfert de fichiers et à l’utilisation de flux, notamment l’emploi de FileInputStream ou d’ObjectOutput/InputStream, avec write(byte[]) et read(byte[]). Certains échanges portent aussi sur la structure du code, comme l’exigence d’une méthode main distincte ou des questions de portée des méthodes publiques ou static, et sur des remarques d’accès refusé à des chemins. En cas de besoin utile, il faut noter que mélanger flux de fichiers et flux de communication peut compliquer le transfert, et que les solutions reposent sur des approches adaptées à chaque type d donnée.

Bobot (l’IA à votre service)
  1. 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.
    1. 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.
    2. 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
    3. Modérateur
      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 !
    4. Merci KX ça marche trés bien !
    5. merci pour ton aide!
  2. 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.
    1. Modérateur
      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;
             }
    2. merci KX j'ai un autre soucis les fichiers excel arrive deformé quand je les ouvres je trouves des codes .
    3. Modérateur
      "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[])...
    4. 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.
    5. Modérateur
      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...
  3. 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.
    1. Modérateur
      "la condition pour appelé la fonction", quelle condition ? quel appel ? quelle fonction ?
  4. 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.
    1. Modérateur
      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;
      	}
      }
  5. 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.
    1. Modérateur
      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.
    2. il disent comme quoi il manque un point virgule mais ils sont tous bien mis en place :s
    3. Modérateur
      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 !
    4. merci KX pour ta réponse.
    5. 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.
  6. 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.
    1. je n'ai pas utilisé objectoutputstream parceque je n'ai pas su comment envoyer les fichier merci
    2. Modérateur
      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();
          }
      }
  7. 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();
        }
    }
    
    
    
    1. Modérateur
      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...
  8. 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!
    1. Modérateur
      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();
      }
  9. 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
    1. Modérateur
      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...
    2. et comme je vais faire pour spécifier le dossier ou va arriver le fichier?
    3. Modérateur
      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\\");
    4. merci KX pour ta réponse jai essayé mais ça na pas marché je ne reçois rien
    5. j'ai mis ça au niveau du serveur

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


      merci
  10. et au niveau du serveur pour récupérer le fichier et le mettre dans un dossier ya un moyen ? merci
    1. Modérateur
      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.
    2. 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
    3. j'ai remplacé le t.tmp par le chemin du dossier mais il me dise accés refusé
    4. Modérateur
      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 !
    5. 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
  11. 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 .
    1. Modérateur
      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.
  12. le serveur que vous mavez donné se déconect a chaque fois qu'il fai une action je ne sais pas pourquoi
    1. Modérateur
      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...
  13. 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.
    1. Modérateur
      Tu ne peux pas faire juste une méthode client, il faut apprendre à structurer ton code en classes, la découper en fonctionnalités et faire tout cela proprement, parce dès que tu arrives sur des trucs un peu plus compliqués comme ici, tu ne t'y retrouves pas !

      C'est bien sûr incomplet, mais voici de quoi (re)commencer :

      import java.io.File;
      import java.io.IOException;
      import java.io.ObjectInputStream;
      import java.io.ObjectOutputStream;
      import java.net.ServerSocket;
      import java.net.Socket;
      
      public class Serveur
      {    
          private final ServerSocket srv;
          private final File root;
          
          public Serveur(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();
      
              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();
          }
      
          public boolean envoiFichier(ObjectInputStream input, ObjectOutputStream output) throws IOException
          {
              //TODO
              envoiConfirmation(output,false,"Mode non implémenté.");
              return false;
          }
          
          public boolean receptionFichier(ObjectInputStream input, ObjectOutputStream output) throws IOException
          {
              // TODO
              envoiConfirmation(output,false,"Mode non implémenté.");
              return false;
          }
          
          public boolean creationDossier(ObjectInputStream input, ObjectOutputStream output) throws IOException
          {
              String dir = input.readUTF();
              
              String[] tab = dir.split("/\\\\");
              
              File parent = root;
              for (String child : tab)
                  parent = new File(parent,child);
      
              try
              {
                  boolean res = parent.mkdir();
                  envoiConfirmation(output,res,parent.getAbsolutePath());
                  return res;
              }
              catch (SecurityException e)
              {
                  envoiConfirmation(output,false,e.toString());
                  return false;
              }
          }
          
          public void envoiConfirmation(ObjectOutputStream output, boolean conf, String msg) throws IOException
          {
              output.writeBoolean(conf);
              output.writeUTF(msg);
              output.flush();
          }
          
          public static void main(String...args) throws IOException
          {
              Serveur s = new Serveur(new File("C:\\test\\"),1234);
      
              for (int i=1; i<=3; i++)
                  s.service();
              
              s.close();
          }
      }

      import java.io.File;
      import java.io.IOException;
      import java.io.ObjectInputStream;
      import java.io.ObjectOutputStream;
      import java.net.InetAddress;
      import java.net.Socket;
      
      public class Client
      {
          public static final String user = System.getProperty("user.name");
          public static final String nom = System.getProperty("user.home");
          
          private final Socket clt;
          private final ObjectInputStream input; 
          private final ObjectOutputStream output; 
          
          public Client(InetAddress address, int port) throws IOException
          {
              clt = new Socket(address,port);
              output = new ObjectOutputStream(clt.getOutputStream());
              input = new ObjectInputStream(clt.getInputStream());
          }
          
          public void close() throws IOException
          {
              input.close();
              output.close();
              clt.close();
          }
          
          public boolean envoiFichier(File fichier) throws IOException
          {
              // TODO
              output.writeInt(1);
              output.flush();
              return receptionConfirmation();
          }
          
          public boolean receptionFichier(String nomFichier, File dst) throws IOException
          {
              // TODO
              output.writeInt(2);
              output.flush();
              return receptionConfirmation();
          }
          
          public boolean creationDossier(String nomDossier) throws IOException
          {
              output.writeInt(3);
              output.writeUTF(nomDossier);
              output.flush();
              return receptionConfirmation();
          }
          
          public boolean receptionConfirmation() throws IOException
          {
              boolean conf = input.readBoolean();
              String msg = input.readUTF();
      
              if (conf)
                  System.out.println("OK : "+msg);
              else
                  System.err.println("KO : "+msg);
              
              return conf;
          }
          
          public static void main(String...args) throws IOException
          {
              Client c1 = new Client(InetAddress.getLocalHost(),1234);
              c1.creationDossier("tata");
              c1.close();
              
              Client c2 = new Client(InetAddress.getLocalHost(),1234);
              c2.creationDossier("tata/toto");
              c2.close();
              
              Client c3 = new Client(InetAddress.getLocalHost(),1234);
              c3.creationDossier("plop/titi");
              c3.close();
          }
      }
      1. merci voici le code complet

        Serveur

        
        package EspaceMateriels;
        
        import java.net.*;
        import java.io.*;
        
        import javax.swing.*;
         
        class Ser
        {
        	
        	public String user = System.getProperty("user.name");
        	public static String nom = System.getProperty("user.home");
             public static void main (String[] args)
             {
                 ServerSocket server;
                 Socket connection = null;
         
                 DataOutputStream output;
                 BufferedInputStream bis;
                 BufferedOutputStream bos;
         
                 byte[] receivedData;
                 int in;
                 String file;
         
                 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();
                         file = file.substring(file.indexOf('\\')+1,file.length());
                         ObjectInputStream ois = new ObjectInputStream(connection.getInputStream());
                        // ois.skip(Long.MAX_VALUE);
                         
                        int confirmation =(Integer) ois.readObject();
                         //aqui se escribe el archivo en la ubicacion donde este el Servidor.jar
                         bos = new BufferedOutputStream(new FileOutputStream("C:\\llego.msi\\"+ file));
                         
                 
        
                     if(confirmation==1)
                     {
                    	 File directorio = new File("c:\\llego.msi\\momo\\"+ file);
                         directorio.mkdirs(); 
                    	// System.exit(0);
                     }
                         while ((in = bis.read(receivedData)) != -1){
                             bos.write(receivedData,0,in);
                         }
                         bos.close();
                        dis.close();
                     //    ois.close();
         
                         JOptionPane.showMessageDialog(null, "Fichier (" + file.toString() + ") Reçu");
                     // System.exit(0);
                     }
                 }catch (Exception e ) {
                     JOptionPane.showMessageDialog(null,e, "Errror",JOptionPane.ERROR_MESSAGE);
                 }
             }
        }
         
        


        Client

        public  void Cliente()
        	{
        	  
        	      int in;
        	      byte[] byteArray;
        	      File archivo = null;
        	      String direccionArchivo = null;
        	      String IP = "127.0.0.1";
        	 
        	      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, "Connecté au Serveur: " + 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();}
        	            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());
        	            
        	            ObjectOutputStream oos = new ObjectOutputStream(via.getOutputStream());
        	       //     oos.flush();
        	            oos.writeObject(1);
        	            byteArray = new byte[8192];
        	            while ((in = bis.read(byteArray)) != -1)
        	            {
        	                bos.write(byteArray,0,in);
        	            }
        	 //  bis.close();
        	  //         bos.close();
        	 
        	            /*JOptionPane.showMessageDialog(null, "Le Fichier  " + archivo.getName().toString() +
        	                                                 " a bien été envoyé");*/
        	            String oups=archivo.getName();
        	            String nom=("/IREG/");
        	            String gogle="//"+IP+nom+"\""+oups+"\"";
        	             gogle1="//"+IP+nom+oups;
        	            
        	            jTextField6.setText(gogle);
        	            jTextField5.setText(gogle1);
        	           System.out.println(gogle);
        	         // String gogle= "\\"+"\\"+IP+nom+oups+""\t;
        	        }
        	 
        	      }catch (Exception e) {//JOptionPane.showMessageDialog(null,e,"Error",JOptionPane.ERROR_MESSAGE);
        	    	  
        	      }
        	   
        	   }
        
        
        


        Merci KX pour ton aide
        1. Modérateur
          public void Cliente() ce n'est pas une classe, ce qu'il faut c'est une méthode main distincte...
      2. Modérateur
        Il ne faut pas fermer les flux sur la socket, ils doivent rester ouverts aussi longtemps que le programme tourne...
        1. merci KX j'ai essayé mais ça marche pas
        2. le dossier se créer une seul fois et je recoi un seul fichier aprés plus rien ne marche
        3. Modérateur
          Il faudrait voir le code complet pour pouvoir tester, mais il y a sérieusement la méthode de développement à revoir, parce que tu mets tout dans un code monolithique, sans distinguer le côté réseau de l'interface graphique, tout se mélange pour complexifier des opérations qui sont finalement assez simple lorsqu'elles sont prises séparément !
      • 1
      • 2