Socket java client serveur - Page 2

Résolu
  1. 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. 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...
    2. 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.
    3. 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
    4. 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
    5. 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();
        }
    6. 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...
    7. 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();
            }
        }
    8. 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.
    9. 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;
        	}
        }
    10. 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 ?
    11. 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...
    12. 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!
    Précédent
    • 1
    • 2