Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Envoi de fichier [ Réseau & internet / Internet ] (seareal)

mercredi 9 août 2006 à 13:14:11 | Envoi de fichier

seareal

Bonjour,

j'ai un petit soucis conceptuel

Voilà, je dois faire un client / serveur capable d'envoyer des fichiers. J'étais donc parti sur l'idée d'envoyer mon fichier par trame de 1 ko selon le principe suivant :

Serveur envoie 1 Ko
Client traite les données puis envoie un accusé de réception (message "ok")
Serveur reçoit le message ok puis renvoie 1 ko
et ainsi de suite jusqu'à la fin.

Tout allait bien, les tests en local montraient des débits de 1 à 3 Mo/s ce qui était satisfaisant mais voilà.. sur internet c'est une toute autre histoire.

En effet, envoyer les données et recevoir l'accusé de réception prends environ 70 ms (à peine plus qu'un ping); du coup, je ne peux envoyer qu'une quinzaine de trame à la seconde soit un débit de .. 15 ko/s ce qui n'est pas acceptable.

Alors j'ai bien essayer de supprimer l'accusé de réception, le serveur envoie en boucle sans arrêt mais là curieusement, les données reçues côté client ne correspondent pas à ce qui a été envoyé; même problème si au lieu d'envoyer une trame de 1 ko, je l'aggrandit à 5...

Mes trames sont formées de la manière suivante :
Taille de la trame codée sur les 4 premiers bytes
Données de la trame codées sur le reste

Quand je dis que les données reçues ôté client ne correspondent pas à ce qui a été envoyé, je le vois du fait que la taille récupérée est complètement aberrante, le problème ne vient pas du fait qu'une trame soit reçue avant les trames précédentes (on sait pas ce qui peut se passer dans un réseau, mais c'est un problème que je gèrerai plus tard).



J'en viens donc à ma question, j'utilise des BufferedIn(Out)putStream, comment faire pour au choix 
- augmenter la taille d'une trame
- s'assurer que les données reçues soit bien les données envoyées

Ou sinon, plus généralement, comment on fait un client/serveur de fichier correct?

Merci d'avance

mercredi 9 août 2006 à 13:33:15 | Re : Envoi de fichier

Twinuts

Membre Club Administrateur CodeS-SourceS
Salut,

pour la taille des paquets voi les constructeurs

BufferedOutputStream(OutputStream out)
          Creates a new buffered output stream to write data to the specified underlying output stream with a default 512-byte buffer size. BufferedOutputStream(OutputStream out, int size)
          Creates a new buffered output stream to write data to the specified underlying output stream with the specified buffer size.

BufferedInputStream(InputStream in)
          Creates a BufferedInputStream and saves its argument, the input stream in, for later use. BufferedInputStream(InputStream in, int size)
          Creates a BufferedInputStream with the specified buffer size, and saves its argument, the input stream in, for later use.


sinon pour des exemples de client/serveur d'envois  de fichiers regarde sur ce site il y en a

------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA

mercredi 9 août 2006 à 14:19:10 | Re : Envoi de fichier

seareal

Les constructeurs ne semblent pas suffisants ou ont leur limites :

je place size = 15*1024 + 4 pour le Output et l'Input (taille du tableau de byte que j'envoie)

Résultat :
mon serveur a envoyé en tout et pour tout 4 trames avant plantage.
le client en a reçu 7 avec des propriétés curieuses :

 - 1ere trame de 12708 byte (là logiquement, il renvoie ok au serveur)
 - 2e trame de 2656 (pareil il renvoie encore une fois ok .. notons que cette trame là est la différence entre ce qu'il aurait du recevoir et ce qu'il a effectivement reçu la première fois)

 - 3e trame de 12708, suivi de deux trames de 1412 et 1244

 - 6e trame de 4236 suivi de 5648

Le serveur a planté car il a reçu "okok" ce qui est considéré comme une erreur


mercredi 9 août 2006 à 16:58:57 | Re : Envoi de fichier

Twinuts

Membre Club Administrateur CodeS-SourceS
Réponse acceptée !
Salut,

je viens de t'envoyer un mai avec un petit exemple de client serveur qui envoi un fichier que le serveur creer.


------------------------------------
"On n'est pas au resto : ici on ne fait pas dans les plats tout cuits ..."

WORA

jeudi 10 août 2006 à 11:19:25 | Re : Envoi de fichier

seareal

Merci bien, le fait de passer par des trames de 1 ko vient du fait que je dois avoir un controle total des débits de réception et d'envoi (au ko près), du coup j'envoyais mes trames tant que je ne dépassais pas mon débit, et je ne recevais que lorsque je n'avais pas reçu plus de données qu'autorisé à la seconde.

J'étais parti sur une bidouille là :

// Réception de la trame
size_msg = in.read(bufferReception, 0, bufferReception.length);

// S'assure que la trame est complète
int compteur = bufferReception.length - size_msg;
while (compteur > 0)
{
      byte[] b = new byte[compteur];
      int nb = in.read(b);
      
      for (int i = 0; i < nb; i++)
       bufferReception[size_msg + i] = b[i];
      
      compteur -= nb;
}


Bon ça marche (j'ai résumé là, la trame de fin est bien gérée) mais ça ressemble à rien, je vais plutot partir sur l'utilisation de available() et voir comment y adapter ma gestion de débit.


En tout cas, merci infiniment pour tes réponses à chaque fois :)




Cette discussion est classé dans : fichier, données, serveur, envoyer, trame


Répondre à ce message

Sujets en rapport avec ce message

envoyer un fichier en RMI [ par lutecefalco ] Salut à tous,j'ai à disposition un serveur avec le logiciel R d'installé dessus.A partir de mon PC, je génère un script et je dois l'envoyer en RMI su Solution : Acces a un fichier en ecriture ? [ par Ahulane ] Voila, j'ai un projet a mener et voici les grandes lignes : Une application qui se charge d'envoyer en permanence des lignes dans un fichier situé su Envoi fichier [ par sekka ] Bonjour,J'ai crée une application serveur qui permet d'envoyer un fichier  à un client2.Cet cette fichier est envoyé par un autre client1 vers le serv Lecture d'un fichier excel et stockage des données dans une List [ par mael974 ] Bonjour,j'utilise L'API POI, et je voudrais lire certaine colone de mon fichier xls et stocker les valeurs dans une LISTE.Pourriez vous me donner des Un Client et Deux Serveur [ par frankyfarell ] Salut tout le monde,J'ai un PB je ne suis pas un pro de Java socketServer, mais je voudrais ecrir un Programme java pour le quel un Client demande des selectionné des valeur a partir d'un fichier [ par dreamnos ] Bonjour à tous,   Je me trouve devant un problème. Je dois une base de données permettant un suivi des données en provenance de capteurs. Afficher les données contenues dans un fichier xml [ par 3etha ] Salut,Je veux afficher le contenu d'un fichier xml à l'aide du jsp et on utilisant une classe java.Comment je peux procèder?merci à tous Connexion Base de données mysql [ par ralebole ] BonjourJ'ai un probleme de connexion a une base de donnée mysql sur serveur en local tous fonctionne bien  mais pas sur mon serveurEn local celui la f Envoyer un objet (client / Serveur) [ par Ombitious_Developper ] Salut :Je veux savoir comment envoyer un objet (en particulier un objet "Image") à travers une connexion client / serveur.---------------------------- enregister données dans un fichier [ par emkka ] Bonjour,Je voudrai savoir quel est le meilleur moyen d'enregister des données par un programme java, est ce que j'utiliserai un fichier ou quelques ch


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,203 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.