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] lent... [FAQ]


Sujet :

Entrée/Sortie Java

  1. #41
    Nouveau membre du Club Avatar de legzo
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 39
    Points
    39
    Par défaut
    Salut! Me voilà rentré d'un grand week end, hop je passe ton petit test et voilà ce que j'obtiens:

    endPoint en 0ms
    Bind en 0ms
    Est-on connecté? false
    Connexion à 10.*.*.88:19999 en 4577ms
    Socket: Socket[addr=10.*.*.88/10.*.*.88,port=19999,localport=1028]
    endPoint en 0ms
    Bind en 10ms
    Est-on connecté? false
    Connexion à 10.*.*.88:21 en 4577ms
    Socket: Socket[addr=10.*.*.88/10.*.*.88,port=21,localport=1050]
    C'est un petit peu mieux que ce que j'obtiens avec mon programme à moi. Néanmoins: j'ai testé avec le port ouvert par mon server java (premier test, port=19999) et j'ai testé sur les ports 21 et 22 (donc ftp et telnet): les résultats sont similaires, ce qui permet de ne pas incriminer mon server java a priori (et ça c'est cool).

    Mais ce qui me trouble c'est que quand je me connecte en telnet avec un client telnet ou par ftp avec un client ftp les temps de connection sont quasinuls.

    Le mystère reste donc complet pour moi.

    Merci pour ton aide jowo

  2. #42
    Nouveau membre du Club Avatar de legzo
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 39
    Points
    39
    Par défaut
    J'ai fait d'autres tests: j'ai rajouté des Date() partout pour voir où ça prenait du temps...

    La tête du code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Là avant j'ai un JOptionPane qui renvoit "host" en string, c'est une IP
     
    	Date date1 = new Date();
    			try {
    				this.hostIP = InetAddress.getByName(host);
    			} catch (UnknownHostException e) {
    				e.printStackTrace();
    			}
    			Date date2 = new Date();
    			visualA2t.settings.host = this.hostIP.getHostName();
    			Date date3 = new Date();
    			System.out.println(date2.getTime() - date1.getTime() + "ms to get IP");
    			System.out.println(date3.getTime() - date2.getTime() + "ms to get hostname");
    			visualA2t.launchConnection();
    Ensuite la connection proprement dite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Date date1 = new Date();
    			connexion = new Socket(hostIP, Integer.parseInt(port));
    			Date date2 = new Date();
     
    			System.out.println(date2.getTime()-date1.getTime()+"ms to connect");
    			// getting streams
    			//logger.info("getting input and output streams.");
    			output = new ObjectOutputStream(connexion.getOutputStream());
    			output.flush(); // compulsory there because objects will be exchanged
    			input = new ObjectInputStream(connexion.getInputStream());
    			//logger.info("done");
    			Date date3 = new Date();
    			System.out.println(date3.getTime()-date2.getTime()+"ms to get streams");

    Premier test: sur la machine incriminée, avec ce code:

    51ms to get IP
    5378ms to get hostname
    140ms to connect
    40ms to get streams
    Deuxieme test: sur une autre machine, même code:

    10ms to get IP
    120ms to get hostname
    30ms to connect
    0ms to get streams
    Ensuite, je teste en faisant un petit changement dans le code: (je mets un .toString sur l'IP au lieu d'un getHostName().)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Là avant j'ai un JOptionPane qui renvoit "host" en string, c'est une IP
     
    	Date date1 = new Date();
    			try {
    				this.hostIP = InetAddress.getByName(host);
    			} catch (UnknownHostException e) {
    				e.printStackTrace();
    			}
    			Date date2 = new Date();
    			visualA2t.settings.host = this.hostIP.toString();
    			Date date3 = new Date();
    			System.out.println(date2.getTime() - date1.getTime() + "ms to get IP");
    			System.out.println(date3.getTime() - date2.getTime() + "ms to get hostname");
    			visualA2t.launchConnection();
    et voilà mes résultats:

    Premier test: sur la machine incriminée, avec ce code:

    10ms to get IP
    0ms to get hostname
    4566ms to connect
    31ms to get streams
    Deuxieme test: sur une autre machine, même code:

    10ms to get IP
    0ms to get hostname
    120ms to connect
    20ms to get streams


    On dirait donc que le probleme se déplace sur le bout de code de connection à proprement parler, alors que ce bout de code n'a pas changé! Cette ligne est exactement la même. Je fais mon socket sur mon IP. La ligne que j'ai modifiée sert juste pour autre chose (stocker qqpart l'adresse du serveur).

    Je suis complétement dans les choux là pour le coup. Une idée d'où ça peut venir ce phénomène?

  3. #43
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    Heureux de te retrouver legzo.

    Utilise de préférence System.currentInMillis à la place de Date.

    Citation Envoyé par legzo
    Là avant j'ai un JOptionPane qui renvoit "host" en string, c'est une IP
    Ton test se déroule dans un progarmme avec Swing?

    Il serait préférable d'effectuer le test sans Swing. Le GC pourrait fausser le résultat.
    Bien le bonjour chez vous
    Jowo

  4. #44
    Nouveau membre du Club Avatar de legzo
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 39
    Points
    39
    Par défaut
    Citation Envoyé par jowo
    Heureux de te retrouver legzo.

    Utilise de préférence System.currentInMillis à la place de Date.

    Citation Envoyé par legzo
    Là avant j'ai un JOptionPane qui renvoit "host" en string, c'est une IP
    Ton test se déroule dans un progarmme avec Swing?

    Il serait préférable d'effectuer le test sans Swing. Le GC pourrait fausser le résultat.
    Yes ça fait plaisir, toutefois, j'aimerais bien en finir avec ce problème
    OKay je prends note des System.currentInMillis.
    Pour le swing, si je veux tester sans, il va me falloir quasiment tout réécrire, donc bon.. puis si ça fausse, ça fausse dans les deux cas je suppose..


    Mais j'en viens de plus en plus à me dire que la machine qui m'embete est surchargée par je-ne-sais-quoi et que c'est la fatalité, etc.. Le deuxieme test s'effectue sur exactement le même type de serveur, Solaris, même JVM, etc...

  5. #45
    Membre chevronné
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 413
    Points : 1 993
    Points
    1 993
    Par défaut
    je te passe mon code:

    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
     
    public static void main(String[] args) {
            String host = "ftp.FreeBSD.org";
            int port = 21;
     
            if (args.length >= 1) {
            	host = args[0];
                if (args.length >=2) {
                    try {
                     port = Integer.parseInt(args[1]);
                    }
                    catch (NumberFormatException nfe) {
     
                    }
                }
            }
            long start;
            long duration;
     
     
            try {
                Socket socket = new Socket();
     
                // l'adresse IP de la cible
                start = System.currentTimeMillis();
                InetAddress ipAddr = InetAddress.getByName(host);
                duration = System.currentTimeMillis();
    			// Socket de la cible
                start = System.currentTimeMillis();
                InetSocketAddress endPoint = new InetSocketAddress(ipAddr, port);
                duration = System.currentTimeMillis() - start;
                System.out.println("endPoint en " + duration+ "ms");
                // Socket locale
                if (!socket.isBound()) {
                    start = System.currentTimeMillis();
                    socket.bind(null);
                    duration = System.currentTimeMillis() - start;
                    System.out.println("Bind en "+ duration + "ms");
                }
                System.out.println("Est-on connecté? " + socket.isConnected());
                // Connexion
                start = System.currentTimeMillis();
                socket.connect(endPoint);
                duration = System.currentTimeMillis() - start;
                System.out.println("Connexion à " + host + ":" +  port + " en "+ duration + "ms");
                // Properties of the current socket
                System.out.println("Socket: " + socket);
                socket.close();
    		} catch (UnknownHostException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
        }
    La méthode exacte est System.currentTimeMillis.

    Ton premier test se fait-il en lançant l'application depuis ton programme de développement?

    Ton second test lances-tu directement l'application genre:java -cp monClassPath MaClass xxxx?
    Bien le bonjour chez vous
    Jowo

  6. #46
    Nouveau membre du Club Avatar de legzo
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 39
    Points
    39
    Par défaut
    OK!!

    Good news everyone:

    40ms to get IP
    0ms to get hostname
    60ms to connect
    20ms to get streams
    ça c'est coooool!

    En fait il semblerait qu'il aimait pas que je lui passe une InetAddress comme paramètre pour créer mon socket et qu'en lui filant une String bête et méchante contenant l'ip ça tourne nickel.

    Je ne sais pas pourquoi il mettait du temps à créer le socket à partir de l'InetAddress et qu'il n'en met plus maintenant, mais ça marche!

    Merci à tous pour le suivi, c'est cool. Special thanks to jowo qui le vaut bien. Merci à mes parents et à mon chat sans qui je ne serais pas là aujourd'hui.

    [fin de l'histoire]

  7. #47
    Nouveau membre du Club Avatar de legzo
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 39
    Points
    39
    Par défaut
    Rhaaa le retour de la revanche!

    En fait il semblerait que la résolution évoquée ci-dessus soit liée en fait à un changement de jdk! J'étais passé en 1.4.2 pour compiler et exécuter et tout s'en trouvait amélioré. Maintenant je suis repassé en 1.5.02 pour tester et j'ai à nouveau des problèmes!!!!

    Je me retrouve avec 6 à 8 secondes pour me connecter sur mon serveur lent. Des temps très inférieurs mais supérieurs à ceux que j'obtenais avec le jdk 1.4.2 sur l'autre serveur (le "normal").

    J'envisage sérieusement de me pendre avec un RJ45...

    Je suis obligé de tourner sur 1.4.2 jusqu'à 1.5 et ça m'ennuit...

  8. #48
    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
    Salut,


    Je fais remonter ce (vieux) sujet car il y a peut-être une explication.

    Il semblerait que Java 5.0 gère désormais le protocole NetBIOS (utilisé principalement sous Windows).
    Or ce dernier pourrait provoquer des temps d'attentes importantes si ce protocole est installé sur votre carte réseaux à cause de la recherche du nom NetBIOS associé à l'adresse IP...

    Apparemment ceci est géré par la classe ProxySelector, et le code suivant permettrait de retrouver le même comportement qu'avec Java 1.4.2 (pas de résolution de nom NetBIOS) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ProxySelector.setDefault(null);
    A vérifier donc car je n'ai pas testé...

    Source : http://forum.java.sun.com/thread.jspa?messageID=3491747

    a++

  9. #49
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Points : 3 736
    Points
    3 736
    Par défaut
    je teste ca demain a la premiere heure !

  10. #50
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Points : 3 736
    Points
    3 736
    Par défaut


    c'est ca ! ben j'aurais préferé que le comportement par defaut soit le meme que le 1.4, et qu'on puisse le modifier pour utiliser netboeuf !
    bon, ben c'est une bonne nouvelle.

  11. #51
    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 lunatix
    ben j'aurais préferé que le comportement par defaut soit le meme que le 1.4, et qu'on puisse le modifier pour utiliser netboeuf !
    Comme quoi on ne peut jamais savoir l'impact que peut avoir une nouvelle fonctionnalité sur le code existant...

    Citation Envoyé par lunatix
    bon, ben c'est une bonne nouvelle.
    content de t'avoir aidé

  12. #52
    Nouveau membre du Club Avatar de legzo
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 52
    Points : 39
    Points
    39
    Par défaut
    Ah bin merci beaucoup! Ca fait plaisir le suivi sur ce forum, c'est cool. Bon je sais pas si je vais pouvoir modifier mon programme de l'époque (j'ai quitté l'entreprise depuis), mais en tout cas, pour la satisfaction intellectuelle c'est cool.

    Thx adiGuba

  13. #53
    Rédacteur
    Avatar de lunatix
    Homme Profil pro
    Architecte technique
    Inscrit en
    Novembre 2002
    Messages
    1 960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Architecte technique

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 960
    Points : 3 736
    Points
    3 736
    Par défaut
    je remonte ce post une derniere fois : c'est corrigé dans la derniere version du JDK \o/
    http://bugs.sun.com/bugdatabase/view...bug_id=5092063

  14. #54
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Bonjour à tous,

    je me permets de remonter ce très vieux topic car j'ai un problème un peu similiaire...

    Le fait de créer un socket est super long sur mon serveur alors qu'en local c'est quasi instantané.

    Le code java pour reproduire le problème :
    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
     
    public static void main(String[] args) {
    		long start,duration;
     
    		ProxySelector.setDefault(null);
     
    		start = System.currentTimeMillis();
    		Socket socket = new Socket(Proxy.NO_PROXY);
    		duration = System.currentTimeMillis();
    		System.out.println("new Socket en " + duration+ "ms");
     
            // l'adresse IP de la cible
            start = System.currentTimeMillis();
            InetAddress ipAddr;
    		try {
    			ipAddr = InetAddress.getByName(CMain.SMTP_SERVER);
     
            duration = System.currentTimeMillis();
    		// Socket de la cible
            start = System.currentTimeMillis();
            InetSocketAddress endPoint = new InetSocketAddress(ipAddr, 25);
            duration = System.currentTimeMillis() - start;
            System.out.println("endPoint en " + duration+ "ms");
            // Socket locale
            if (!socket.isBound()) {
                start = System.currentTimeMillis();
                socket.bind(null);
                duration = System.currentTimeMillis() - start;
                System.out.println("Bind en "+ duration + "ms");
            }
            System.out.println("Est-on connecté? " + socket.isConnected());
            // Création de la connexion
            start = System.currentTimeMillis();
            socket.connect(endPoint);
            duration = System.currentTimeMillis() - start;
            System.out.println("Connexion à " + CMain.SMTP_SERVER + ": 25 en "+ duration + "ms");
            // Properties of the current socket
            System.out.println("Socket: " + socket);
            socket.close();
    		} catch (UnknownHostException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
     
    	}
    Le résultat de l'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    new Socket en 1222861725682ms
    endPoint en 0ms
    Bind en 0ms
    Est-on connecté? false
    Connexion à 127.0.0.1 : 25 en 0ms
    Socket: Socket[addr=localhost/127.0.0.1,port=25,localport=35106]
    Ma version de java :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    java version "1.6.0_07"
    Java(TM) SE Runtime Environment (build 1.6.0_07-b06)
    Java HotSpot(TM) 64-Bit Server VM (build 10.0-b23, mixed mode)
    J'ai également testé avec java 1.5 et 1.4 et j'ai le même soucis...

    Lorsque je fais un telnet 127.0.0.1 25, la connexion est instantanée.

    Mon fichier /etc/hosts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    127.0.0.1       localhost
    XX.XXX.XXX.XXX    XXXXX 
     
    # The following lines are desirable for IPv6 capable hosts
    XXXXXX ::1     ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    ff02::3 ip6-allhosts
    C'est sur une debian 4.0.

    D'avance merci de votre aide

  15. #55
    Invité
    Invité(e)
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    new Socket en 1222861725682ms
    Ce résultat s'explique car dans ton code tu ne soustrais pas la valeur de départ...

    EDIT: tu constates combien de temps pour créer ta socket dans les faits ?

  16. #56
    Candidat au Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Oops mauvais copié/collé... c'est très long plusieurs minutes!

    Voila l'exécution avec la soustraction effectuée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    new Socket en 189001ms
    endPoint en 0ms
    Bind en 0ms

+ Répondre à la discussion
Cette discussion est résolue.
Page 3 sur 3 PremièrePremière 123

Discussions similaires

  1. [Débuter] Socket très lent
    Par uriotcea dans le forum Réseau
    Réponses: 6
    Dernier message: 16/03/2013, 18h38
  2. Réponses: 1
    Dernier message: 04/12/2008, 23h42
  3. [Réseau] socket trop lent
    Par cid7777 dans le forum C++
    Réponses: 5
    Dernier message: 12/07/2007, 00h30
  4. socket : UDP a partir d'un autre ordi super lent
    Par RaphAstronome dans le forum Ruby
    Réponses: 3
    Dernier message: 21/05/2007, 22h15
  5. [Socket] Rafraichissement lent de l'image
    Par keil dans le forum Multimédia
    Réponses: 9
    Dernier message: 26/10/2005, 15h01

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