cs_Diabolus
Messages postés61Date d'inscriptionsamedi 20 décembre 2003StatutMembreDernière intervention28 septembre 2007
-
21 juin 2005 à 09:25
tasshil
Messages postés4Date d'inscriptiondimanche 8 avril 2007StatutMembreDernière intervention12 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.
Master_364
Messages postés16Date d'inscriptionsamedi 9 avril 2005StatutMembreDerniè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.
cs_Diabolus
Messages postés61Date d'inscriptionsamedi 20 décembre 2003StatutMembreDernière intervention28 septembre 20071 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());
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.
Master_364
Messages postés16Date d'inscriptionsamedi 9 avril 2005StatutMembreDerniè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.