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 qui ne se ferme jamais..?


Sujet :

Entrée/Sortie Java

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Socket qui ne se ferme jamais..?
    Bonsoir,

    J'ai fait un petit code pour pouvoir récupérer une page (style developpez.net) que je veux et la sauvegarder où je veux. Sauf qu'il y a un petit problème
    Le programme s'execute correctement (c'est à dire que je peux me connecter et j'enregistre bien la page) En revanche, le programme ne s’arrête jamais. Comme s'il était pris dans une boucle infinie !

    Quelqu'un aurait une petite idée du pourquoi du comment ?
    Lien vers le code.

    Merci d'avance !
    Bonne soirée.

    Edit:
    De plus, il y a des nombres qui s'incrustent dans le fichier crée.. "1000" puis "0"

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    'Faudrait que tu nous donnes l'URL en question, mais ça c'est le signe typique de la méthode "ma réponse ne se termine jamais, comme ça quand j'ai du nouveau à dire, j'ai qu'à le pousser dans la socket qui est encore ouverte."

    Les chiffres au milieu, signes de chunked-encoding, en sont une preuve de plus.

    Dans ce cas-là, c'est à toi de choisir quand tu estimes que tu as fini de recevoir la réponse, et fermer la socket de force, à ce moment-là.

    Edit : Ah bah oui, tiens. Le keep-alive fonctionne comme ça. Je savais pas. Merci adiGuba.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    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,



    Déjà désolé mais le code n'est pas très propre
    • Un bloc catch vide !!!!
    • Plein de traitement dans un constructeur d'une classe qui ne comporte rien. Ce ne serait pas mieux de mettre tout cela dans une méthode static ?
    • Il manque aussi le try/finally pour la fermeture des ressources...



    Quand à ton problème, il vient du fait que tu ne respectes pas le protocole HTTP/1.1 contrairement à ce que tu annonces au serveur...
    En HTTP/1.1 le fichier est tronqué en morceaux, avec une ligne indiquant la taille du morceau qu'il faut lire. Une taille de zéro indique la fin de la réponse mais la connexion reste ouverte pour une nouvelle demande (keep-alive).


    Comme tu ne respectes pas cela tu te retrouves bloqué : le serveur attend une nouvelle demande de ta part, alors que toi tu attends le reste de la réponse (qui est déjà fini).


    De deux choses l'une :
    • soit tu prévoit d'implémenter toi-même le protocole HTTP/1.1, et dans ce cas il va falloir te plonger dans sa RFC pour être bien conforme.
    • soit tu veux simplement télécharger le fichier et tu utilises la classe URL qui fait cela très bien :

    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
    	public static void download(URL url, File destination) throws IOException {
    		InputStream input = url.openStream();
    		try {
    			OutputStream output = new FileOutputStream(destination);
    			try {
    				byte[] buffer = new byte[8192];
    				int read;
     
    				while ((read=input.read(buffer)) > 0) {
    					output.write(buffer, 0, read);
    				}
    				output.flush();
    			} finally {
    				output.close();
    			}
    		} finally {
    			input.close();
    		}
    	}

    a++

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2012
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup pour votre aide !
    Finalement, j'utilise la classe URL comme l'a conseillé adiGuba.

Discussions similaires

  1. Socket qui se ferme sans raison
    Par rXpCH dans le forum Développement Web en Java
    Réponses: 2
    Dernier message: 10/07/2009, 12h54
  2. [FORMS] Form qui ne se ferme pas
    Par MxPx_23 dans le forum Oracle
    Réponses: 4
    Dernier message: 08/12/2005, 07h29
  3. [MySQL] pconnect, on ferme jamais?
    Par Husqvarna dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 14/10/2005, 17h27
  4. [Servlet] Servlet qui ne se lance jamais
    Par Shiryu44 dans le forum Servlets/JSP
    Réponses: 23
    Dernier message: 31/03/2005, 15h41
  5. [Process][exec] processus qui ne se termine jamais?
    Par la.musaraigne dans le forum API standards et tierces
    Réponses: 3
    Dernier message: 15/06/2004, 14h02

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