Envoi et réception d'un flux de bit

cs_Diabolus Messages postés 61 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 28 septembre 2007 - 21 juin 2005 à 09:25
tasshil Messages postés 4 Date d'inscription dimanche 8 avril 2007 Statut Membre Dernière intervention 12 avril 2007 - 11 avril 2007 à 22:15
Bonjour
je cherche à faire un petit logiciel de ftp.
Je veux pouvoir transférer des fichiers en mode binaire.

Pour l'envoi j'utilise ça :

for (int i=0; i<fileLength; i++){
data.write(dataToCLient.readByte());
}

et le client est au courant de la valeur de la variable fileLength.

et pour la réception j'utilise ça :

for (int i=0; i<testFile.length(); i++){
dataFromClient.writeByte(data.readByte());
}

ça ne marche pas tout le temps. certaines fois la réception ne voit pas la fin du processus et le transfert ne se termine jamais et le débit est affreusement lent.

Merci

6 réponses

Master_364 Messages postés 16 Date d'inscription samedi 9 avril 2005 Statut Membre Dernière intervention 5 juillet 2005
21 juin 2005 à 10:47
Salut diabolus

Tout d'abord, je trouve ton code ou plutôt la parcelle que tu nous en amontrés peu clair. On ne sait pas non plus si il s'agit de la même classe ou de deux différentes. De plus, je ne comprends pas très bien à quoi correspondent tous tes flux (quelle liaison) et puis à partir de quoi sont ils crées(un socket, un fichier, ou encore autre chose).
Mais pour avoir plusieurs fois crée des classes transmettant des informations entre deux ordinateurs connectés entre eux par le net. Je peux te dire que moi, je crée une classe qui lit tous les bytes d'un fichier(celui que tu veux transmettre), puis que tu les envoies dans le socket reliant le serveur et le client grâce à un flux d'écriture. Puis, je crée une deuxième classe client qui se charge de lire toujours à partir d'un flux de lecture associé au socket, puis les inscrit dans un nouveau fichier graâce à un flux d'écriturer associé à un fichier.
Cependant si ton serveur ftp n'est censé fonctionner qu'en réseau ou encore pour autre chose, le protocole sera peut-être différent mais je pense que le principe sera semblable.
P.S: Si tu utilises les sickets, n'oublie pas de faire la connexion entre les deux classes java avant d'effectuer le transfert.

Bonne chance, @+
0
cs_Diabolus Messages postés 61 Date d'inscription samedi 20 décembre 2003 Statut Membre Dernière intervention 28 septembre 2007 1
21 juin 2005 à 10:59
Voici ma classe complète où j'effectue les traitements liés au transfert :

public abstract class FtpOperation
{
public FtpOperation(Socket socket) throws IOException
{
m_Socket = socket;


// Prepare the output stream
OutputStream ostream = m_Socket.getOutputStream();
m_Output = new PrintStream(ostream);


// Prepare the input stream
InputStream istream = m_Socket.getInputStream();
InputStreamReader reader = new InputStreamReader(istream);
m_Input = new BufferedReader(reader);
}


protected void receiveFile(String filename)
{
byte dataReceived;
try{
int fileLength = Integer.parseInt(m_Input.readLine());
if ( fileLength >= 0 ){
FileOutputStream file = new FileOutputStream(filename);
DataOutputStream data = new DataOutputStream(file);
DataInputStream dataToCLient = new DataInputStream(m_Socket.getInputStream());


for (int i=0; i<fileLength; i++){
data.writeByte(dataToCLient.readByte());
}

file.close();
data.close();
}else{
System.out.println("The file "+filename+" do not exist.");
}
}catch(IOException e){
System.out.println("Error: "+e.getMessage());
}
}


protected void sendFile(String filename)
{
File testFile = new File(filename);
try{
if ( !testFile.exists() ){
m_Output.println(-1);
System.out.println("The file "+filename+" do not exist.");
}else{
m_Output.println(testFile.length());

FileInputStream file = new FileInputStream(filename);
DataInputStream data = new DataInputStream(file);
DataOutputStream dataFromClient = new DataOutputStream(m_Socket.getOutputStream());

for (int i=0; i<testFile.length(); i++){
dataFromClient.writeByte(data.readByte());
}
file.close();
data.close();
}
}catch(IOException e){
System.out.println("Error: "+e.getMessage());
}
}


protected abstract void cmdLS() throws IOException;
protected abstract void cmdPWD() throws IOException;
protected abstract void cmdCD(String directory);
protected abstract boolean cmdBYE();
protected abstract void cmdGET(String filename);
protected abstract void cmdPUT(String filename);



protected Socket m_Socket;
protected PrintStream m_Output;
protected BufferedReader m_Input;
}

Mon serveur a un objet d'une classe liée au serveur, héritant de cette classe FtpOperation et le client a un objet d'une classe liée au client, héritant de cette classe FtpOperation.

Quand le serveur envoie un fichier il appelle la méthode sendFile et le client appelle la méthode receiveFile au même moment.
0
safisoft Messages postés 489 Date d'inscription vendredi 30 janvier 2004 Statut Membre Dernière intervention 13 mai 2009 6
21 juin 2005 à 13:58
BLATEER
0
safisoft Messages postés 489 Date d'inscription vendredi 30 janvier 2004 Statut Membre Dernière intervention 13 mai 2009 6
21 juin 2005 à 14:00
utilise plutot des DataInputStream .read(byte[] buffer) et des DataOutputStream
.write(byte[] b, 
int off, int len)
;
0

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

Posez votre question
Master_364 Messages postés 16 Date d'inscription samedi 9 avril 2005 Statut Membre Dernière intervention 5 juillet 2005
22 juin 2005 à 15:15
Salut, ton probleme est que tu fais ton serveur et ton client à partir de la meme classe alors que leurs comportements sont différents.
Par exemple si j'ai bien compris ton code tu utilises la meme méthode receivefile pour ton serveur et ton clientalors que le serveur devrait utiliser cette méthode à partir d'un file et le client à partir d'un socket le reliant au serveur.
Si je devais te donner un conseil, ce serait d'effectuer deux classes différentes en raisonnant séparément pour chaque classe.
P.S: safisoft a raison, utilises des DataInputStream et des DataOutputStream, c bcp plus pratik.
0
tasshil Messages postés 4 Date d'inscription dimanche 8 avril 2007 Statut Membre Dernière intervention 12 avril 2007
11 avril 2007 à 22:15
Bonjour
je cherche à faire un petit logiciel de ftp.
Je veux pouvoir transférer(envoyer et recevoir) des fichiers texte.merci de me repndre.
0
Rejoignez-nous