Transfert fichier java socket

cs_othmane19 Messages postés 5 Date d'inscription jeudi 30 décembre 2010 Statut Membre Dernière intervention 12 novembre 2011 - 10 nov. 2011 à 16:47
cs_othmane19 Messages postés 5 Date d'inscription jeudi 30 décembre 2010 Statut Membre Dernière intervention 12 novembre 2011 - 12 nov. 2011 à 23:22
Bonjour,
en faite je voulais envoyer un fichier d'un client a un serveur en utilisant socket java j'ai réussi a faire un transfert direct entre:
client----------->serveur(entre 2 machine en local)
je cherche a le faire en passant par plusieurs serveur intermédiaire(en local ):exemple client--->serveur1----->serveur2---->serveur final
le client envoi le fichier a serveur1 qui le relaye jusqu'à a l'arrivé au serveur final.
voici mon code pour l'envoi directe (sachant que j ai prevoyé l'envoi dune liste pour le chemin mais ca c'est la 2 étape..)
classe client
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package chat_compris;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;

/**
*
* @author othmane
*/
public class client1
{
public static void main(String[] args) throws IOException
{
// En-tête Ã* envoyer
String[] tab = {"Serveur1", "Serveur2","Serveur3", "Client"};

// Ouverture de la communication

Socket sock = new Socket(InetAddress.getLocalHost(),9001);
ObjectOutputStream out = new ObjectOutputStream(sock.getOutputStream());

// Envoi de l'en-tête
out.writeInt(tab.length);
for (int i=0; i<tab.length; i++)
out.writeUTF(tab[i]);

// Envoi du fichier
commun.transfert(
new FileInputStream(new File("C:\\M1\\oth.png")),
out,
true);

// Fermeture de la communication
sock.close();
}
}
classe serveur
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package chat_compris;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

/**
*
* @author othmane
*/
public class serveur1
{

public static void main(String[] args) throws IOException
{
// Ouverture d'une communication
Socket sock = new ServerSocket(9001).accept();
ObjectInputStream in = new ObjectInputStream(sock.getInputStream());

// Réception de l'en-tête
int n = in.readInt();

String[] tab = new String[n];

for (int i=0; i<n; i++)
tab[i]=in.readUTF();

// Réception du fichier
commun.transfert(
in,
new FileOutputStream(new File("C:\\M2\\f2.png")),
true);

// Fermeture de la communication
sock.close();

// Affichage de l'en-tête
for (String s : tab)
System.out.println(s);



}
}
classe comun
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

package chat_compris;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

/**
*
* @author othmane
*/
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();
}
}
}
avez vous une idée sur le code pour réussir ca
merci de votre compréhension
merci de votre aide d'avance
A voir également:

10 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
10 nov. 2011 à 19:33
Bonjour,

Admettons que tu as réussi a envoyer des données d'un serveur A vers un serveur B. Et que ce programme s'appelle Envoi

Ce qu'il te reste à faire est de créer les programmes s'exécutant sur les relais.

Pour cela, je te conseil de créer un dossier nommé par exemple "depot" sur les serveurs relais. Ensuite, tu peux créer un programme que tu appelles Surveillant et qui vérifie s'il y a des fichiers dans le dossier depot et qui s'il y a des fichier récupère les noms pour appeler ton programme Envoi.

Le programme Surveillant est assez simple à réaliser, il te suffit de vérifier le contenu du répertoire dépôt toutes les secondes par exemple.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
10 nov. 2011 à 19:35
Je ne sais pas exactement ce que tu cherches à faire mais, si ton travail se limite à ce que tu décris, je ne pense pas que java soit le langage le plus adapté. Les langages système (batch, shell) sont vraiment adaptés pour ce genre de travail.
0
cs_othmane19 Messages postés 5 Date d'inscription jeudi 30 décembre 2010 Statut Membre Dernière intervention 12 novembre 2011
10 nov. 2011 à 21:34
merci pour ta reponse en bref ce que je cherche c'est envoyer un fichier da A vers D en passant par B et C donc le but est simple
et en ce qui concerne lz 2 etape c'est de pouvoir calculer le chemin
(ca j en parle pas pour le moment).s'il vous plait si vous pouvez me debloquer je serai trés reconnaissant
donc je cherche le code qui va pouvoir relayer le fichier sachant que je vous ai montré le code utilisé pour l'envoi de A vers B
donc je pense que c'est claire

merci pour votre aide d'avance
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
10 nov. 2011 à 22:06
Que ce que c'est que B et C, des routeurs ? Si ce ne sont pas des routeurs, mais que ce sont bien des serveurs de traitement, ma réponse est adaptée.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_othmane19 Messages postés 5 Date d'inscription jeudi 30 décembre 2010 Statut Membre Dernière intervention 12 novembre 2011
10 nov. 2011 à 22:27
on aura besoin des serveur (des machine en local)
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
10 nov. 2011 à 23:34
Si tu ne fais pas des réponses plus explicites et plus claires, je ne pourrai pas t'aider...
0
cs_othmane19 Messages postés 5 Date d'inscription jeudi 30 décembre 2010 Statut Membre Dernière intervention 12 novembre 2011
11 nov. 2011 à 01:45
merci pour ta réponse
le but est simple lancer des machine en local
A B C D
envoyer un fichier de A a D
en passant par B et C
A-->B--->C--->D
de A vers D en passant par B et C
tous ca constitue un réseau logique q on doit pouvoir simuler en local
je pense que y pas plus claire que ca comme but
merci pour votre aide d'avance
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
11 nov. 2011 à 08:18
Oui, je comprend parfaitement ce que tu cherches à faire,

Qu'est ce qui ne te conviens pas dans ma première réponse ?
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 367
12 nov. 2011 à 19:24
Alors, tu t'en sors ?
0
cs_othmane19 Messages postés 5 Date d'inscription jeudi 30 décembre 2010 Statut Membre Dernière intervention 12 novembre 2011
12 nov. 2011 à 23:22
j'ai reussi en se basant juste sur les numero de port
et voila le code j'ai savoir q est ce que t on pense
j ai simuler un envoi de client vers serveur en passant par A et B et C
s il te plait dit q est ce que tu en pense
et merci de votre aide
pour la classe commun j ai gardé la même:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/


client
public class cl
{
public static void main(String[] args) throws IOException
{
Socket sock = new Socket(InetAddress.getLocalHost(),9001);




commun.transfert(new FileInputStream("C:\\M1\\oth.png"),sock.getOutputStream(),true);

sock.close();
}
}



A



public class A
{
public static void main(String[] args) throws IOException
{
Socket sock = new ServerSocket(9001).accept();

//recevoir
commun.transfert(
sock.getInputStream(),
new FileOutputStream("C:\\M2\\f1.png"),
true);

//envoyer//
Socket sock2 = new Socket(InetAddress.getLocalHost(),9002);
commun.transfert(new FileInputStream("C:\\M2\\f1.png"),sock2.getOutputStream(),true);




//envoyer//


sock.close();
}
}



B

public class B
{
public static void main(String[] args) throws IOException
{
Socket sock2 = new ServerSocket(9002).accept();

//recevoir
commun.transfert(
sock2.getInputStream(),
new FileOutputStream("C:\\M3\\finale.png"),
true);

int a=0;
int port;
//envoyer a 9004//
if(a==1)
{
port=9004;
}
else
port=9003;

Socket sock3 = new Socket(InetAddress.getLocalHost(),port);
commun.transfert(new FileInputStream("C:\\M3\\finale.png"),sock3.getOutputStream(),true);



sock2.close();
}
}



C


public class C
{
public static void main(String[] args) throws IOException
{
Socket sock3 = new ServerSocket(9003).accept();

//recevoir
commun.transfert(
sock3.getInputStream(),
new FileOutputStream("C:\\M4\\finale.png"),
true);

//envoyer//
Socket sock4 = new Socket(InetAddress.getLocalHost(),9004);
commun.transfert(new FileInputStream("C:\\M4\\finale.png"),sock4.getOutputStream(),true);




sock3.close();
}
}

public class srv
{
public static void main(String[] args) throws IOException
{
Socket sock4 = new ServerSocket(9004).accept();


commun.transfert(
sock4.getInputStream(),
new FileOutputStream("C:\\M5\\finale.png"),
true);

sock4.close();
}
}
0