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 :

Sockets et récupération de lourdes données


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Par défaut Sockets et récupération de lourdes données
    Bonjour,

    je dois récupérer le contenu d'une réponse à une requête HTTP or ce contenu est trop important pour une seule trame TCP. Actuellement, j'utilise cette méthode pour récupérer la réponse HTTP, mais lorsque les données sont trop importantes, seule la première trame semble être récupérée. Existe t-il un moyen d'accèder aux autres trames qui sont sensées (?) arriver sur le même socket (enfin là je m'avance peut-être un peu) afin donc de pouvoir retourner une réponse complète?

    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
     
            String tmp = "";
            try {
                Socket so = new Socket(host,port);
                so.setKeepAlive(true);
                Scanner sc = new Scanner(so.getInputStream());
                PrintWriter pw = new PrintWriter(so.getOutputStream(),true);
     
                // Envoie de la requête s
                pw.println(s);
     
                while (!sc.hasNextLine());
                while (sc.hasNextLine()) {
                    tmp += sc.nextLine() + "\r\n";
                }
                sc.close();
                pw.close();
                so.close();
            } catch (UnknownHostException ex) {
                ex.printStackTrace();
            } catch (IOException ex) {
                ex.printStackTrace();
            }
     
            return tmp;

  2. #2
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    La notion de trame n'existe pas réellement avec l'utilisation de la classe Socket.
    J'ai déjà utilisé Socket pour transférer des fichiers de 1Go sans aucun soucis ( le protocol TCP est capable de faire le découpage lui même ).
    Quel est ton problème ? t'as un message d'erreur ? une exception ? le pc se fige ? le pc prend feu ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Par défaut
    Et bien, rien de tout celà, je récupère simplement une partie de la réponse HTTP à savoir son entête et une partie des données xml qu'elle contient ce qui rend la réponse intraitable, ayant augmenté le timeout dans la requête HTTP et la taille du buffer alloué au socket via le serverSocket, je pensais qu'il s'agissait peut-être d'un soucis pour recoller les morceaux.

    Je vérifie la taille de la partie récupérée, on sait jamais... (mais vu que ça prend entre 5 et 10 minutes par test c'est pas évident ^^)

    Edit: donc la chaîne a une taille de 336300 ce qui signifie que c'est pas lié au découpage des paquets... Hummm... alors je ne vois pas de raison valable à ce que mon Scanner arrête soudainement de scanner sans être arrivé au bout de la réponse...

  4. #4
    Membre Expert
    Profil pro
    Fabrication GED
    Inscrit en
    Octobre 2005
    Messages
    1 405
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Fabrication GED

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 405
    Par défaut
    Conseils / idées :
    1) ne pas utiliser String pour la concaténation de chaines de caractères, préférer StringBuffer, ça va beaucoup, beaucoup plus vite sur de grosses chaines.
    2) Ne peux-tu pas effectuer ton traitement ligne par ligne ( après ton sc.nextLigne ), plutôt que de tout vuoloir stocker en mémoire pour traitement futur ?
    3) ton "while (!sc.hasNextLine());" est-il utile ( je n'utilise jamais la classe Scanner, faut que je m'y mette ) ? Je demande ça, car normalement un read est bloquant.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Par défaut
    Pour le StringBuffer, je regarderai ça, pour le traitement ligne par ligne c'est difficile puisque le traitement de chaque reponse se fait avec l'intégralité de celle ci (puisque parfois seuls des champs du Header seront traités, parfois ce sera le xml des data, y aurait surement eu moyen de faire plus rapide mais là on a pas vraiment eu le temps de prendre notre temps à chercher la solution la plus optimisée ).

    Et en ce qui concerne mon:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                while (!sc.hasNextLine());
                while (sc.hasNextLine()) {
                    tmp += sc.nextLine() + "\r\n";
    l'idée est de rendre le sc.nextLine() non bloquant afin de s'arrêter lorsque la réponse est finie, mais de bloquer en attente d'une réponse. Bon j'aurais surement pû faire un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
               tmp = sc.nextLine() + "\r\n";
               while (sc.hasNextLine()) {
                    tmp += sc.nextLine() + "\r\n";
    il est vrai... quoiqu'il faudra que je vérifie que le nextLine() est bloquant, disons que dans le doute...

    Mais je ne m'explique pas pourquoi il s'arrête en pleine lecture d'une réponse, je vais faire un deuxième test, pour voir si la taille lue est toujours la même.

    Edit: 344967 cette fois... c'est pas très loin de la précédente... pourtant ça n'a rien de phénoménal quand même... quoique, je vais augmenter drastiquement la taille de buffer alloué au socket on verra ce que ça peut donner, ou utiliser un StringBuffer pour gagner du temps.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 24
    Par défaut
    Bon bah l'utilisation du StringBuffer lors du scan résoud tout en plus du gain de performances qui n'est pas négligeable. Merci du coup de main

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [C#] Récupération d'une donnée dans BDD Access
    Par Kerod dans le forum Windows Forms
    Réponses: 8
    Dernier message: 29/07/2014, 19h29
  2. [ODBC] Récupération d'une donnée pour insertion dans une autre table
    Par rom950 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/03/2006, 17h13
  3. [Récupération]Base de données après problème disque
    Par Cyborg289 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 15/02/2006, 15h08
  4. Réponses: 2
    Dernier message: 14/10/2005, 10h11
  5. Réponses: 4
    Dernier message: 11/06/2004, 16h27

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