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 :

TCP/IP String lent


Sujet :

Entrée/Sortie Java

  1. #1
    Membre actif Avatar de Belegkarnil
    Inscrit en
    Juin 2005
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juin 2005
    Messages : 289
    Points : 205
    Points
    205
    Par défaut TCP/IP String lent
    Bonjour, je fais un serveur et un client sous TCP/IP. J'envoie une très longue chaîne de caractères, et cela prend beaucoup de temp. Y a t'il un moyen de raccourcir? Soit un moyen d'envoyer plsu vite les données, ou compresser la chaine (par exemple avec l'agorithme zip)...?

    Merci d'avance

  2. #2
    Membre éclairé Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    Points : 724
    Points
    724
    Par défaut
    Montre ton code d'envoi
    Tu peux peut être utiliser un tableau de bytes, tu gagneras du temps...
    "Il y a 3 personnes en ce monde sur qui tu peux compter : moi, le pape et le cavalier solitaire ! "
    Penser à svp

  3. #3
    Membre actif Avatar de Belegkarnil
    Inscrit en
    Juin 2005
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juin 2005
    Messages : 289
    Points : 205
    Points
    205
    Par défaut
    Je veux bien, mais il n'y a rien de spétial. Je vais chercher dans informations dans une base de données Access. Je concatène toutes ces informations en une string, et je l'envoie. Quand je fais copier coller de la String dans word, j'obtient 70pages.

    Côté 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
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
      	public void connection(String requete) {
        	Socket socket;
        	DataInputStream userInput;
        	PrintStream theOutputStream;
       try{
        	socket = new Socket(serveur, port);
        	try {
          		BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
          		PrintStream out = new PrintStream(socket.getOutputStream());
          		out.println(pseudo+";"+passe+";"+requete);
          		String reponce = "";
          		boolean continuer=true;
          		do{
    				String temp = in.readLine();
    				reponce+=temp+"\n";
    				if(temp==null)continuer=false;
    			}while(continuer);
          		rep=reponce;
        	} catch (Exception e) {
          		e.printStackTrace();
        	}finally{
    			try{socket.close();
    			}catch(IOException e){}
    		}
    	}catch(UnknownHostException uhe){uhe.printStackTrace();
    	}catch(IOException ioe){ioe.printStackTrace();}
      	}
    Côté 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     
    import java.net.*;
    import java.io.*;
    import java.security.*;
    import java.nio.channels.*;
    class TCPIP{
    	static ServerSocketChannel serverSocketChannel = null;
    	static ServerSocket serverSocket = null;
    	static Socket clientSocket = null;
    	static boolean fin = false;
    	public static void main(String arg[]){
    		try{
         		System.out.println("Lancement du serveur");
    			SocketAddress address = new InetSocketAddress(666);
    			serverSocketChannel = serverSocketChannel.open();
    			serverSocket = serverSocketChannel.socket();
    			serverSocket.bind(address);
    			while(!fin){
    				try{
    					clientSocket = serverSocket.accept();
    					traitements();
    				} catch(ClosedByInterruptException IException){
    					fin = true;
    				}
    			}
    		} catch(IOException IException){
    			IException.printStackTrace();
    		} finally {
    			try{
    				if(serverSocket != null) serverSocket.close();
    			} catch(Exception IException){
    			}
    			try{
    				if(serverSocketChannel!=null) serverSocketChannel.close();
    			} catch(Exception IException){
    			}
    		}
    	}
    	public static void traitements() {
    		try{
    			System.out.println("Connection établie");
    			String messageRecu = "",messageEnvoye,
    			ip= ""+clientSocket.getInetAddress();
    			//if(ip.equals("/127.0.0.1")) fin=true;
    			BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream()));
    			PrintStream out = new PrintStream(clientSocket.getOutputStream());
    			messageRecu = in.readLine();
    			String pseudo = messageRecu.substring(0,messageRecu.indexOf(";")),
    					passe = messageRecu.substring(messageRecu.indexOf(";")+1,messageRecu.indexOf(";",1+messageRecu.indexOf(";"))),
    					requete = messageRecu.substring(passe.length()+pseudo.length()+2);
    			messageEnvoye = "";
    			String idOK;
    			idOK=Access.verifieID(pseudo,Codeur.MD5(passe),"SELECT * FROM autorisation");
    			if(!idOK.equals("false")){
    				int numero = Integer.valueOf(idOK);
    					idOK=Access.verifieID(pseudo,Codeur.MD5(passe),"SELECT * FROM autorisation");
    					messageEnvoye=toAString(Access2.newEnleveNull(Access2.newEleveAvecLeTout(Access2.newIdEleves(""+numeroProf))));//,numeroProf
    			}else messageEnvoye += "ERREUR";
    				out.println(messageEnvoye);
    				clientSocket.close();
    				System.out.println("Connection fermée");
    		}catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	public static String toAString(String donnee[][]){
    		String retour="";
    		for(int i=0;i<donnee.length;i++){
    			retour+=((char)18);
    			for(int j=0;j<donnee[i].length;j++)
    				retour+=((char)8)+donnee[i][j];
    		}
    		return retour;
    	}
    }
    Voila puisqu'il faut absolument le code

  4. #4
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Quelques remarques :
    traitements();
    : pourquoi l'avoir déclaré static si c'est pour l'appelé ainsi ?
    Ensuite à mon avi, la lenteur proviens de ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for(int i=0;i<donnee.length;i++){
    			retour+=((char)18);
    			for(int j=0;j<donnee[i].length;j++)
    				retour+=((char)8)+donnee[i][j];
    		}
    C'est pas très propre ton code, mais je suis pas là pour te faire la leçon (en plus si tu voyais le mien ) mais il me semble que cette "double" boucle
    est un peu "caca" .
    Enfin voila. La méthode toAString() est également en static, alors que ne l'utilise pas en t'en que static. Cela n'a pas grande importance, mais bon...

  5. #5
    Membre éclairé Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    Points : 724
    Points
    724
    Par défaut
    Bon déjà, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String temp;
    while((temp = in.readLine) != null) {
    	reponse+=temp+"\n";
    }
    Au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          		do{
    				String temp = in.readLine();
    				reponce+=temp+"\n";
    				if(temp==null)continuer=false;
    			}while(continuer);
    Je cherche pour le reste...
    "Il y a 3 personnes en ce monde sur qui tu peux compter : moi, le pape et le cavalier solitaire ! "
    Penser à svp

  6. #6
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Citation Envoyé par sozie9372
    Bon déjà, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    String temp;
    while((temp = in.readLine) != null) {
        reponse+=temp+"\n";
    }
    L'utilisation d'un StringBuilder (ou StringBuffer si < Java 5) serait plus appropriée .
    cf Comment concatener des chaînes de caractères ?
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  7. #7
    Membre éclairé Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    Points : 724
    Points
    724
    Par défaut
    Je voulais savoir, si tu envoies de petites données, ca mets du temps ?
    Sinon, je pense toujours que la solution d'un tableau de bytes en plusieurs fois serait judicieuse...
    "Il y a 3 personnes en ce monde sur qui tu peux compter : moi, le pape et le cavalier solitaire ! "
    Penser à svp

  8. #8
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par le y@m's
    L'utilisation d'un StringBuilder (ou StringBuffer si < Java 5) serait plus appropriée .
    cf Comment concatener des chaînes de caractères ?
    100 % D'accord ! Et à mon avis ton principal problème vient de là !!!

    L'utilisation de l'opérateur + (ou +=) sur des String dans une boucle est un anti-pattern, car il implique la création de nombreuses chaines temporaires. Ainsi si tu tentes de lire un fichier de 1 Mo par ligne de 100 caractères, tu auras allouer/désallouer plus de 700 Mo de mémoire...

    De même je te conseille d'utiliser un bloc try/finally par ressource que tu ouvres, cela te permettra de libérer les ressources proprement quoi qu'il arrive... Et si tu utilises un try/catch fais le remonter d'un cran plutôt que d'utiliser un try/catch/finally qui t'oblige à traiter un try/catch supplémentaire.

    Cela pourrait donner :
    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
        public void connection(String requete) {
            try {
                Socket socket = new Socket(serveur, port);
                try {
                    BufferedReader in = new BufferedReader(new InputStreamReader(
                            socket.getInputStream()));
                    try {
                        StringBuilder buf = new StringBuilder();
                        String line;
     
                        while ( (line=in.readLine()) != null ) {
                            buf.append(line).append("\n");
                        }
     
                        rep = buf.toString();
                    } finally {
                        in.close();
                    }
                } finally {
                    socket.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    a++

  9. #9
    Membre actif Avatar de Belegkarnil
    Inscrit en
    Juin 2005
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juin 2005
    Messages : 289
    Points : 205
    Points
    205
    Par défaut
    Oui, si je met des petites données, cela est très rapide. La lenteur ne vient pas du code (à la limite, ca ralenti d'une seconde si je n'ai pas fait le plus court possible), mais du paquet de données. J'envoie une String qui équivaut à 70pages de word. La lenteur provient donc des données. Comment les compacter...?
    Pour envoyer en byte, je ne sais pas comment faire.

  10. #10
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Belegkarnil
    La lenteur ne vient pas du code (à la limite, ca ralenti d'une seconde si je n'ai pas fait le plus court possible), mais du paquet de données. J'envoie une String qui équivaut à 70pages de word. La lenteur provient donc des données. Comment les compacter...?

    • As-tu essayé avec un StringBuffer/StringBuilder à la place de la concaténation de chaine ?
    • 70pages de Word ? Ca équivaut à quoi en Mo ??? Cela ne doit être bien méchant...
    • As-tu essaysé d'envoyer les données via FTP (ou un autre protocole) ? Est-ce que c'est aussi lent qu'avec ton programme ?
    Citation Envoyé par Belegkarnil
    Pour envoyer en byte, je ne sais pas comment faire.
    Il suffit d'utiliser un byte[] suffisamment grand (1024 par exemple), et de lire directement avec la méthode read(byte[]) de l'InputStream. Mais ce n'est interréssant que si tu renvoit directement les données plutôt que de tout chargé en mémoire...

    a++

  11. #11
    Membre actif Avatar de Belegkarnil
    Inscrit en
    Juin 2005
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juin 2005
    Messages : 289
    Points : 205
    Points
    205
    Par défaut
    Non, je n'ai pas essayer avec un autre protocole. Ni avec les StringBuffer/StringBuilder . Quel est l'avantage avec des StringBuffer/StringBuilder ? Merci

  12. #12
    Expert confirmé
    Avatar de le y@m's
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    2 636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2005
    Messages : 2 636
    Points : 5 943
    Points
    5 943
    Par défaut
    Citation Envoyé par Belegkarnil
    Quel est l'avantage avec des StringBuffer/StringBuilder ?
    Déjà dit : Comment concatener des chaînes de caractères ?
    Je ne répondrai à aucune question technique par MP.

    Pensez aux Tutoriels et aux FAQs avant de poster (pour le java il y a aussi JavaSearch), n'oubliez pas non plus la fonction Rechercher.
    Enfin, quand une solution a été trouvée à votre problème
    pensez au tag

    Cours Dvp : http://ydisanto.developpez.com
    Blog : http://yann-disanto.blogspot.com/
    Page perso : http://yann-disanto.fr

  13. #13
    Membre actif Avatar de orelero
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    389
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 389
    Points : 274
    Points
    274
    Par défaut
    Quel est l'avantage avec des StringBuffer/StringBuilder ?
    Je crois que ça permet un traitement plus rapide vu qu'on ne recréer pas à chaque fois une autre chaine de caractere dés qu'il y a une modification .
    J'ai vu quelque part que c'est ça qu'il faut systématiquement utiliser du coté serveur quand il y a un traitement lourd de chaines de caractères.
    "L'imagination est plus importante que la connaissance." - Albert Einstein.

  14. #14
    Membre actif Avatar de Belegkarnil
    Inscrit en
    Juin 2005
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juin 2005
    Messages : 289
    Points : 205
    Points
    205
    Par défaut
    En fait, le serveur envoie 1Ko toute les minutes environs.

  15. #15
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Belegkarnil
    En fait, le serveur envoie 1Ko toute les minutes environs.
    Et ? Ton problème est résolu ? Tu en es où ???

    a++

  16. #16
    Membre actif Avatar de Belegkarnil
    Inscrit en
    Juin 2005
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juin 2005
    Messages : 289
    Points : 205
    Points
    205
    Par défaut
    Et bien c'est toujours aussi lent. J'envoie en une fois une String, et donc le serveur devrait envoyer + ou - 300Ko en une fois ce qui me semble ne doit pas prendre longtemps. Mais le serveur n'envoie que 1Ko / minute + ou -

  17. #17
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Belegkarnil
    Et bien c'est toujours aussi lent. J'envoie en une fois une String, et donc le serveur devrait envoyer + ou - 300Ko en une fois ce qui me semble ne doit pas prendre longtemps. Mais le serveur n'envoie que 1Ko / minute + ou -
    Tu es sûr que tu n'aurais pas un problème réseau ? Tu as essayé avec un autre protocole ?
    Quel est ton code désormais ???

    a++

  18. #18
    Membre actif Avatar de Belegkarnil
    Inscrit en
    Juin 2005
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juin 2005
    Messages : 289
    Points : 205
    Points
    205
    Par défaut
    Mon code n'est pas beacoup changé, mais comment puis-je changer de protocole? Est-ce que certains ports ont une vitesse limitées? Lorsque je calcule le temps pour préparer ma chaine à envoyé, il ne faut même pas une seconde, mais l'envoie dure plus de temps.

  19. #19
    Membre éclairé Avatar de sozie9372
    Inscrit en
    Mai 2005
    Messages
    713
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2005
    Messages : 713
    Points : 724
    Points
    724
    Par défaut
    Je trouve ca un peu long tout de même...
    "Il y a 3 personnes en ce monde sur qui tu peux compter : moi, le pape et le cavalier solitaire ! "
    Penser à svp

  20. #20
    Membre actif Avatar de Belegkarnil
    Inscrit en
    Juin 2005
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juin 2005
    Messages : 289
    Points : 205
    Points
    205
    Par défaut
    Le temp de pour préparer toutes les données? Oui mais j'ai du travailler avec une base de données mal faite, le directeur de mon école ne voulait pas qu'on la change. Donc je dois passer par plusieurs tables pour associer des données, trier, et redemander des données... Mais si ca prend une seconde, ca ne dérange pas trop par à l'envoie de données qui peut prendre 10minutes -30minutes
    Voila pourquoi je demande de l'aide.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème String TCP
    Par migutz dans le forum VB.NET
    Réponses: 3
    Dernier message: 21/11/2007, 14h49
  2. récupérer string par socket TCP
    Par bogsy15 dans le forum C++
    Réponses: 14
    Dernier message: 11/06/2006, 16h05
  3. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47
  4. Réponses: 2
    Dernier message: 05/06/2002, 12h29
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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