Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Reseau] Porbleme transfert de fichier appli Client Serveur

    22 décembre 2009 à 13:04:40

    Bonjour, je post car j'ai un probleme avec une appli Client Serveur que je developpe actuellement. Pour vous expliquer le fonctionnement jai un serveur qui attend des connexions, s'il y en a une il lance un thread client qui boucle tant quil n'a pas d'instruction, s'il en a il lance un thread. De l'autre coté j'ai un Client qui se connecte au serveur et lance une instruction au serveur via un boutton swing. Mon test ici est de lancé un thread par le serveur pour envoyé un fichier et de l'autre coté mon client lance un thread pour la réception. Mon probleme : le fichier est reçu mais pas entier. Je sollicite donc votre attention pour essayer de résoudre mon probleme le code :

    Serveur :
    import java.io.*;
    import java.net.*;
    import java.util.*;
     
    import javax.swing.JFileChooser;
    import javax.swing.JFrame;
     
    public class Serveur {
    	
    	private ServerSocket serverSocket;
    	public ArrayList<PrintStream> liste;
    	public Serveur(int port){
    		try {
    			serverSocket = new ServerSocket(port);
    			while(true){
    				System.out.println("Attente Connexion ...");
    				System.out.println("----------------");
    				
    				Socket socket = serverSocket.accept();
    				System.out.println("Client connecté");
    				
    				//pour les transferts de fichier
    				OutputStream fluxsortie = socket.getOutputStream();
    				InputStream fluxentrant = socket.getInputStream();
    				
    				//pour les commandes
    				PrintStream commandeOut= new PrintStream(socket.getOutputStream());
    				BufferedReader commandeIn = new BufferedReader(new InputStreamReader(socket.getInputStream()));
    				
    				Client client = new Client(commandeIn,commandeOut,fluxentrant,fluxsortie);
    				client.start();
    			}
    		}
    		catch (IOException e) {e.printStackTrace();}
    		
    	}	
    		
     
    }
    

    Thread Client
    import java.io.*;
    import java.util.*;
    import java.net.*;
    import java.awt.*;
    public class Client extends Thread{
    	
    	//pour les fichiers
    	OutputStream fluxsortie ;
    	InputStream fluxentrant ;
    	
    	//pour les commandes
    	PrintStream commandeOut;
    	BufferedReader commandeIn;
    	
    	public Client(BufferedReader commandeIn, PrintStream commandeOut,InputStream fluxentrant,OutputStream fluxsortie){
    		this.fluxentrant=fluxentrant;
    		this.fluxsortie=fluxsortie;
    		this.commandeIn=commandeIn;
    		this.commandeOut=commandeOut;
    		
    	}
     
    	public synchronized void run() {
    		
    		System.out.println("Client lancé");
    		String ligne="";
    		
    		while(true){
    			try {
    				ligne=commandeIn.readLine();
    				System.out.println(ligne);
    				String [] requete=ligne.split(" ");
    				
    				if(requete[0].equals(new String("WANT"))){
    					
    					System.out.println(requete[1]);
    					Send send = new Send(fluxsortie,requete[1]);
    					send.start();
    					
    				}
    				else if(requete[0].equals(new String("LIST"))){
    					File repertoire = new File("/Users");
    					String [] listefichiers;
     
    					int i;
    					listefichiers=repertoire.list();
    					for(i=0;i<listefichiers.length;i++){
    					commandeOut.println(listefichiers[i]);
     
    					} 
    					
    				}
    				
    			}
    			catch (IOException e) {e.printStackTrace();}
    			
    			
    		}
    		
    		
    	}
    	
    	
    	
    }
    


    le Thread Send pour l'envoi de fichier :
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
     
     
    public class Send extends Thread{
    	OutputStream fluxsortie;
    	String fichier="";
    	
    	public Send(OutputStream fluxsortie, String fichier){
    		this.fluxsortie=fluxsortie;
    		this.fichier=fichier;
    	
    	}
    	
    	public synchronized void run(){
    		File f = new File(this.fichier);
    		if(f.exists())
    		{
    			try{
    			System.out.println("Envoi du fichier "+f.toURI().toURL());
    			
    			
     
    			long taillefichier =f.length();
     
    			System.out.println("Taille : "+ taillefichier);
     
    			long nbpassagesuposé=taillefichier / 4096;
     
    			System.out.println("Passages supposés : "+nbpassagesuposé);
     
    			InputStream in = new BufferedInputStream(new FileInputStream(f));
    			ByteArrayOutputStream tableaubytes = new ByteArrayOutputStream();
    			BufferedOutputStream tampon = new BufferedOutputStream(tableaubytes);
     
    			int lu = in.read();
    			int[] aecrire = new int[4096];
    			int compteur = 0;
    			long ouonestrendu=0;
     
    			//Tant qu'on est pas à la fin fu chier
    			while(lu > -1)
    			{
    				//On lit les données du fichier
    				aecrire[compteur] = lu;
    				lu = in.read();
    				compteur++;
     
     
    				//Quand on a rempli le tableau, on envoie un paquet de 4096 octets
    				if(compteur == 4096)
    				{
    					compteur=0;
    					ouonestrendu++;
    					//On remplit le tampon
    					for(int x=0;x<4096;x++)
    						tampon.write(aecrire[x]);
     
    					//Et on l'envoie
    					fluxsortie.write(tableaubytes.toByteArray());
     
    					tableaubytes.reset();
    					System.out.println("Avancement : "+(float) ouonestrendu/nbpassagesuposé * 100+"%");
    				}
    			}
     
    			//On envoie le dernier paquet, qui ne fait pas forcément 4096 octets
    			//On remplit le tampon
    			for(int x=0;x<4096;x++)
    				tampon.write(aecrire[x]);
     
    			//Et on l'envoie
    			tampon.flush();
    			fluxsortie.write(tableaubytes.toByteArray());
    			fluxsortie.flush();
     
    			System.out.println("Avancement: "+(float) ouonestrendu/nbpassagesuposé * 100+"%");
     
    			System.out.println("Youpi finished");
    			in.close();
    			tampon.close();
    			System.out.println("Passages effectués : "+ouonestrendu);
    			
    		}
    			catch(IOException e){e.printStackTrace();}
    		}
    		else
    		{
    			System.out.println("Le fichier "+f+" est introuvable");
    		}
     
    	}
     
    }
    

    Mon client :
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.BufferedReader;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.io.PrintStream;
    import java.net.InetAddress;
    import java.net.Socket;
    import java.net.UnknownHostException;
     
    import javax.swing.*;
     
     
     
     
    public class Client {
    	PrintStream outServeur;
    	BufferedReader inServeur;
    	//Création de l'entrée pour reception fichier
    	InputStream inpute;
    	public Client() throws UnknownHostException{
    		
    		Fenetre frame = new Fenetre(this);
    		frame.ecrire("Salut");
    		
    		
    		
    		//adresse serveur
    		InetAddress adresse =InetAddress.getByName("localhost");
    		
    		//requete
    		String mess ="WANT /Users/zimon/Desktop/fondGui.jpg";
    		String mess2="LIST";
    		String messServeur="";
    		
    		try {
    			Socket serviceSocket = new Socket(adresse, 4501);
    			outServeur = new PrintStream(serviceSocket.getOutputStream(),true);
    			inServeur = new BufferedReader(new InputStreamReader(serviceSocket.getInputStream()));
    			
    			inpute = serviceSocket.getInputStream();
    			
    			while(true){
    				String ligne = inServeur.readLine();
    				if (ligne!=null){
    					frame.ecrire(ligne);
    				}
    			}
    			
    		}
    		
    		catch (IOException e) {e.printStackTrace();}
    		
    		
    	}
    public static void main(String[] args) throws UnknownHostException{
    		
    		Client cli = new Client();
    		
    	}
    

    GUI Client :
    import java.awt.Dimension;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
     
    public class Fenetre extends JFrame implements ActionListener {
    	JLabel label;
    	JPanel pan;
    	JButton bouton;
    	Client cli;
    	
    	public Fenetre(Client cli){
    		this.cli=cli;
    		Toolkit t = this.getToolkit();
    		Dimension d = t.getScreenSize();
    		pan = new JPanel();
    		label = new JLabel();
    		bouton= new JButton("WANT");
    		bouton.addActionListener(this);
    		pan.setSize(100,70);
    		//pan.add(label);
    		pan.add(bouton);
    		this.setTitle("Client");
    		this.setSize(500, 300);
    		this.setLocationRelativeTo(null);
    		this.setUndecorated(false);
    		this.setContentPane(pan);
    		this.setVisible(true);
    		
    	}
    	public void ecrire(String message){
    		this.pan.add(new JLabel(message));
    		
    	}
    	public void actionPerformed(ActionEvent ev) {
     
    		Object action = ev.getSource();
    			
    		if(action==bouton){
    			Receiver receiver = new Receiver(this.cli.inpute);
    			receiver.start();
    			this.cli.outServeur.println("WANT /Users/zimon/Desktop/fondGui.jpg");
    			
    			
    		}
     
    				
     
    		}
     
     
    }
    

    Le thread Receiver pour la reception fichier :
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
     
     
    public class Receiver extends Thread {
    	InputStream inpute;
    	
    	public Receiver(InputStream inpute){
    		this.inpute=inpute;
    	}
    	
    	public synchronized void run(){
    		while(true)
    		{
    			try{
    			//On attend la connexion
     
    			Byte[] taillefichier;
    			int lu;
    			long taille = 0;
     
    			OutputStream out = new FileOutputStream("/Users/zimon/Desktop/test.jpg");
     
    			//Reçoit du client
    			BufferedInputStream inBuffer = new BufferedInputStream(inpute);
     
    			//Envoi vers le fichier
    			BufferedOutputStream outBuffer = new BufferedOutputStream(out);
     
    			lu = inBuffer.read();
     
    			int compteur = 0;
     
    			while(lu > -1)
    			{
    				outBuffer.write(lu);
    				lu = inBuffer.read();
     
    				compteur++;
    			}
     
    			outBuffer.write(lu);
     
    			outBuffer.flush();
    			outBuffer.close();
    			inBuffer.close();
     
    			out.flush();
    			out.close();
    			//inpute.close();
    			}
    			catch (IOException e){e.printStackTrace();}
     
    		}
    		
    	}
    	
     
    }
    

    Lanceur Serveur :
    import java.io.IOException;
    import java.net.Socket;
     
     
    public class Lanceur {
    	
    	public static void main(String[] args){
    		int port = 4501;
    		Serveur serveur = new Serveur(port);
    		
    			
    			
    			
    		}
    		
    		
    }
    
    • Partager sur Facebook
    • Partager sur Twitter

    [Reseau] Porbleme transfert de fichier appli Client Serveur

    × 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