Partage
  • Partager sur Facebook
  • Partager sur Twitter

comment envoyer un fichier par bloc

socket

Sujet résolu
    23 février 2009 à 22:16:57

    moi j'envoi juste par octect mais c'est trop long :colere2:
    voici le code :
    coté serveur
    import java.io.*;
    import java.net.ServerSocket;
    import java.net.Socket;
    public class Server {
    
    	public static void main(String[] args) throws IOException{
    		String Nom = Clavier.lireString() ;
    
    		File Fichier = new File(Nom) ;
    		DataInputStream  Fin  = new DataInputStream (new FileInputStream (Fichier));
    		///BufferedReader Fin = new BufferedReader(new FileReader(Fichier));
    
    		
    		System.out.println("Taille : "+Fichier.length()+"\nNom : "+Fichier.getName());
    
    		
    
    
    	
    		
    		ServerSocket SSock = new ServerSocket(1500);
    
            System.out.println("En attente de connexion...");
            
            Socket CSock = SSock.accept();
            DataOutputStream Sout = new DataOutputStream(CSock.getOutputStream());
            BufferedOutputStream BSout = new BufferedOutputStream(CSock.getOutputStream());
           
            //PrintWriter  SoutPW  = new PrintWriter (new OutputStreamWriter(CSock.getOutputStream ()));
            //DataInputStream  Sin  = new DataInputStream (CSock.getInputStream ());
            System.out.println("Machine connected !!");
            System.out.println("IP : "+CSock.getInetAddress().getHostAddress());
           
    		//BufferedWriter SoutP = new BufferedWriter(new OutputStreamWriter(CSock.getOutputStream()));
    	     //OutputStreamWriter out = new OutputStreamWriter(CSock.getOutputStream());
            long s = 0 ;
    		Sout.writeBytes(Nom);
    		Sout.flush();
    		Sout.writeLong(Fichier.length());
    		Sout.flush();
    		
    		while(s != Fichier.length()){
    			BSout.write(Fin.read());
    			BSout.flush();
    			s++;
    		}
    
    		//PrintWriter Sout = new PrintWriter(new OutputStreamWriter(CSock.getOutputStream()));
            //BufferedReader Sin = new BufferedReader(new InputStreamReader (CSock.getInputStream ()));
    		//BufferedReader  SinR  = new BufferedReader (new InputStreamReader(CSock.getInputStream ()));
    		//String ligne = SinR.readLine();
    		
    	}
    
    }
    


    coté client
    import java.io.*;
    import java.net.InetAddress;
    import java.net.ServerSocket;
    import java.net.Socket;
    
    public class Client {
    	
    	public static void main(String[] args) throws IOException{
    
    
    		
    
    		
    	
    		
    		InetAddress addr = InetAddress.getByName("yous18.no-ip.biz");
    		Socket Sock = new Socket(addr,1500);
    		
    		DataOutputStream Sout = new DataOutputStream(Sock.getOutputStream());
    		DataInputStream Sin = new DataInputStream(Sock.getInputStream());
    		BufferedInputStream BSin = new BufferedInputStream(Sock.getInputStream());
    	    BufferedReader  SinR  = new BufferedReader (new InputStreamReader(Sock.getInputStream ()));
            System.out.println(addr.getHostAddress()+"\nMachine : "+addr.getHostName());
    		String Nom = SinR.readLine();
    		long taille = Sin.readLong();
    		System.out.println("Nom : "+Nom+"\tTaille : "+taille);
    		
    		File Fichier = new File("Client_"+Nom) ;
    		DataOutputStream  Fout  = new DataOutputStream (new FileOutputStream (Fichier));
    		///BufferedReader Fin = new BufferedReader(new FileReader(Fichier));
    		
    		long s = 0 ;
    		while(s != taille){
    			Fout.write(BSin.read());
    			s++;
    		}
            	
    		
    	}
    
    }
    


    et il y a des chose (des truc ou astuce) que je peux ajouter dans ce code pour l"ameliorer ?
    • Partager sur Facebook
    • Partager sur Twitter
      23 février 2009 à 22:30:59

      c'est du C++ ton truc ? ca ressemble pas mal a java et y a pas moyen que tu envoies un objet ?...je vois la methode write() comme en java ca envoie byte par byte mais en java il existe aussi writeObject(), writeLine() (ou printLine() a voir) enfin tout ca pour dire kil doit y avoir des methodes similaire en C++
      • Partager sur Facebook
      • Partager sur Twitter
        23 février 2009 à 22:33:49

        C'est du java son code, il s'est juste trompé de balises.
        Et puis apparemment il marche, il cherche juste à l'optimiser un peu.

        Je m'y connais pas trop en transfert de données, mais à priori tu peux donner la taille que tu veux à ton buffer non ? Si tu veux transférer deux octets par deux octets ben fais en sorte que ton buffer ait cette taille là ^^'
        (Ou je dis une grosse connerie et arrêtez-moi)
        • Partager sur Facebook
        • Partager sur Twitter
          23 février 2009 à 22:44:14

          j'ai changé le code en java :D
          oui je cherche une fonction qui fai ça mais je la connai pas meme pour le tampon :-°


          enfin c'est regler et voici le code :
          coté serveur :
          while( (n=Fin.read(Donnee)) != -1){//n le nb d'octect effectivement lu	
          			BSout.write(Donnee, 0, n);
          			BSout.flush();
          
          		}
          SinR.readLine();//on attend ici l'acquitement depuis le client avant de quitter brutalement ou faire autre chose
          

          coté client :
          while((n = Sin.read(Donnee)) != -1){//n le nb d'octect effectivement lu
          			Fout.write(Donnee, 0, n);
          			Fout.flush();
          			if(s == taille){
          				Sout.writeBytes("Ack\n");//un acquitement pour prevenir le serveur de l'arriver de tous le fichier avant qu'il quite ou fasse qq chose autre
          				break ;
          			}	
          		}
          


          • Partager sur Facebook
          • Partager sur Twitter

          comment envoyer un fichier par bloc

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown