IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

[Socket]probleme de debit avec des socketssl


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Invité
    Invité(e)
    Par défaut [Socket]probleme de debit avec des socketssl
    Bonjour,

    J'ai une application C/S qui permet d'envoyer des fichier via un socketssl.

    Tout marche nikel ... sauf que le debit est tres tres pourris.En transferant un fichier de 800ko, j'ai une vitesse de 1ko/s em local !!

    Voila le bout de code qui envoi le fichier cote client
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // envoi la taille du fichier au serveur
    			String size = "#" + fic.length() + "#" + fic.getName() + "#\n";
    			out.write(size.getBytes());
    			int limite = new Long(fic.length()).intValue();
    			// envoi le fichier via le tableau de byte
    			for (int i = 0; i < limite; i++) {
    				byte[] temp = new byte[1];
    				temp[0] = ficBinaire[i];
    				out.write(temp);
    				out.flush();
    				// System.out.println(i);
    			}
    			fluxFic.close();
    Voici le bout de code cote serveur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    String temp = inString.readLine();
    			if(temp == null){return true;}
    			StringTokenizer strTk = new StringTokenizer(temp, "#");
    			long Size = Integer.parseInt(strTk.nextToken());
    			String OldName = strTk.nextToken();
    			int indexExt = OldName.lastIndexOf('.');
    			String FicName = OldName.substring(0, indexExt) + "_copy"
    					+ OldName.substring(indexExt);
     
    			FileOutputStream fic = new FileOutputStream(FicName);
    			long k = 0;
    			byte[] tmp = new byte[1];
    			in.read(tmp);
    			long Start = System.currentTimeMillis();
    			while (k < Size - 1) {
    				fic.write(tmp);
    				in.read(tmp);
    				k++;
    			}
    			fic.close();
     
    			// statistiques
    			long End = System.currentTimeMillis();
    			long nbOctet = k / 8;
    			long vitesse = nbOctet / ((End - Start) / 1000 + 1);
    			System.out.println("FIN RECEPTION : " + nbOctet + " octets copie,"
    					+ vitesse + " oct/sec n " + FicName);
    Tout n'est pas parfait (notement le passage des info sur le fichier qui interdit un # dans le nom du fichier ^^), mais ca marche , le probleme viens du debit.

  2. #2
    Membre expérimenté Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Par défaut
    J'ai répondu à un problème identique
    voir :
    http://www.developpez.net/forums/sho...33&postcount=8

  3. #3
    Invité
    Invité(e)
    Par défaut
    Oke merci, desole mais j'ai fait quelques recherche mais sans resultat

    Est ce que tu peut m'expliquer pourquoi le writeByte et readByte sont plus rapide ?

  4. #4
    Membre expérimenté Avatar de jibbi
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    165
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 165
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    for (int i = 0; i < limite; i++) {
    				byte[] temp = new byte[1];
    				temp[0] = ficBinaire[i];
    				out.write(temp);
    				out.flush();
    				// System.out.println(i);
    			}
    Ce n'est pas readByte et writeByte qui est plus rapide. c'est ta structure qui fait renlentir. Tu n'utilse pas de BufferXXXStream. Dans ta boucle ci haut tu fait un appel a new a chaque itération...Imagine un fichier de 1 gig ca donne autant d'appel a new qu'il y a de byte. D'ailleurs, tu crée un tableau de un seul byte. Si t'a besion d'un seul byte alors fait : byte temp;
    Finalement, flush() est placé dans ta boucle, cela force l'evoi du paquet.
    Donc t'envoi byte par byte (1 byte = 1 octect = 8 bits) alors q'un protocle TCP peut contenir 4 bytes (32 bits) de données. Dans les deux cas tu utilse un tampon pour transmettre les données entre les flux soit temp[] et tmp. En imbriquant les streams: out.write(int.read()); plus besoin de ces tampons.

    On peut combiner readInt() et writeInt(), readByte et writeByte pour faire encore plus rapide....

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci beaucoup

  6. #6
    Invité
    Invité(e)
    Par défaut
    Desole de uper le topic, mais ca concerne le meme sujet et vu que j ai ecris le premier j'pas trop envie de creer un autre topic.

    Une question :

    J'ai actuelement un debit de 500ko/s quand j'envoi des fichier via des socket ssl en local. Est ce normal ?? Ca fait pas beaucoup je pense, faudrait que je teste peut etre sur une machine plus puissante ou meme sur un serveur.

Discussions similaires

  1. [MySQL] Probleme d'affichage avec des checkbox
    Par napz dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 08/11/2006, 14h43
  2. Problème de formulaire avec des If-Else
    Par MasterChief78 dans le forum Access
    Réponses: 21
    Dernier message: 29/08/2006, 12h54
  3. Petit problemes de variables avec des Packages
    Par Invité dans le forum Modules
    Réponses: 4
    Dernier message: 02/08/2006, 17h08
  4. Probleme de boucle avec des processus sous UNIX
    Par sebastieng dans le forum POSIX
    Réponses: 6
    Dernier message: 15/10/2005, 18h57
  5. Réponses: 6
    Dernier message: 04/04/2003, 15h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo