Téléchargement
illégal
Posez votre question Signaler

Envoi des fichiers par des sockets java [Résolu]

tissouassoum - Dernière réponse le 26 nov. 2011 à 15:13
salut, pour mon projet je dois implémenter une application web qui servira à l'envoi des images et du sons, pour cela j'ai utilisé les sockets en JAVA j'ai mes codes qui marchent parfaitement coté serveur et coté client, je fais le RUN tout se passe bien et mon fichier, une fois reçue par mon serveur il est bien créé mais quand je le consulte je ne le trouve pas en totalité ( pour le son seulement quelques secondes sont jouées et parfois non executable, pour l'image, elle ne s'affiche pas il n'y a q'un croix rouge ) veuillez m'aider S.V.P et merci
et voila mes codes :
Côté Client:
public class Client {
public static void main(String[] zero) throws IOException {
File f = new File("C:\\Users\\Douda\\Downloads\\musicmp4.MP4");
if(f.exists())
{
System.out.println("Envoi du fichier "+f.toURI().toURL());
Socket s = new Socket(InetAddress.getLocalHost(),9001);
OutputStream fluxsortie = s.getOutputStream();
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 du fichier
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
byte[] b=tableaubytes.toByteArray();
tampon.write(b);
tampon.flush();
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<compteur;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);
s.close();
}
else
{
System.out.println("Le fichier "+f+" est introuvable");
}
}
}
-----------------------------
*****************************
Coté Serveur:
public class Serveur {
public static void main(String[] zero) throws IOException {
//On attend la connexion d'un client
ServerSocket socketserver= new ServerSocket(9001);
Socket serviceSocket = socketserver.accept();
int lu;
//Création de l'entrée
InputStream inpute = serviceSocket.getInputStream();
OutputStream out = new FileOutputStream("C:\\musicmp4.MP4");
//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();
serviceSocket.close();
}
}
<config,g>Windows 7 / Safari 535.1</config>
Lire la suite 

Envoi des fichiers par des sockets java »

5 réponses
Réponse
+10
moins plus
Bon j'ai regardé ton code, le moins qu'on puisse dire c'est que tu te compliques la vie !
En particulier, pourquoi as-tu besoin d'ouvrir autant de flux ?

Voici le coeur du programme, tu vas voir qu'en fait c'est très simple !

public class Commun
{
    public static void transfert(InputStream in, OutputStream out, boolean closeOnExit) throws IOException
    {
        byte buf[] = new byte[1024];
        
        int n;
        while((n=in.read(buf))!=-1)
            out.write(buf,0,n);
        
        if (closeOnExit)
        {
            in.close();
            out.close();
        }
    }
}

public class Client
{
    public static void main(String...args) throws IOException 
    { 
        Socket sock = new Socket(InetAddress.getLocalHost(),9001);
    
        Commun.transfert(
                new FileInputStream("D:\\test.jpg"),
                sock.getOutputStream(),
                true);
        
        sock.close();
    } 
}

public class Serveur
{
    public static void main(String...args) throws IOException 
    { 
        Socket sock = new ServerSocket(9001).accept();
        
        Commun.transfert(
                sock.getInputStream(),
                new FileOutputStream("D:\\test2.jpg"),
                true);
        
        sock.close(); 
    } 
}
tissouassoum - 23 août 2011 à 13:01
merciiiiiiiiiiiiiiiiiiiiiiiiiiiii c'est trop mignon, court, et bien développé, et ça marche parfaitement :)
merci
Diouf - 26 nov. 2011 à 15:10
Mais moi je le lane comment ceci?
Et puis, drvrai-je mettre chaque classe ainsi décrite dans un fichier .java séparément?
KX- 26 nov. 2011 à 15:13
Oui chaque classe dans un fichier .java séparé, et après tu lances la classe serveur puis la classe client dans deux fenêtres distinctes.
Ajouter un commentaire
Réponse
-1
moins plus
t es sur qu il faut pas passer tes buffers en hexa ???
Et ta boucle d'arret doit se faire avec un code d'echappement, si mes souvenirs sont bon.
Par exemple un buffer d'une certaine taille avec des carracteres a la manque dedans ...
tu peux aussi rajouter un correcteur d erreur sur ta trame comme une somme que tu envoies soit à la fin soit comme nouvelle trame ...
Differents modèles de protocoles te permettent de jongler sur ces echanges ...
par exemple, renvoie de la trame si elle est fausse ou intercepté ...
Ajouter un commentaire
Ce document intitulé « envoi des fichiers par des sockets java » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?