2009-06-16 7 views
1

Le serveur Tomcat s'exécute aux États-Unis. Je me connecte au serveur en provenance de Chine en utilisant HTTPURLConnection de Java. Veuillez consulter l'extrait de code utilisé côté client et la configuration du connecteur https dans le serveur Tomcat ci-dessous.Impossible de télécharger des fichiers zip occasionnellement

<!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 --> 
    <Connector acceptCount="100" clientAuth="false" connectionTimeout="-1" debug="4" disableUploadTimeout="true" enableLookups="false" keystoreFile="conf/server.keystore" keystorePass="passw47d" maxSpareThreads="75" maxThreads="150" minSpareThreads="25" port="443" scheme="https" secure="true" sslProtocol="TLS" useBodyEncodingForURI="true"/> 


    URL url=new URL(urlString); 
    HttpsURLConnection connection=null; 
    try 
    { 
     connection=(HttpsURLConnection)url.openConnection(); 
     connection.setDoOutput(true); 
     connection.setDoInput(true); 
     connection.setRequestMethod("POST"); 
     connection.setRequestProperty("Content-Type", "application/zip"); 
     connection.setRequestProperty("Transfer-Encoding", "chunked"); 
     connection.setChunkedStreamingMode(4096); 
     connection.connect(); 
     sout=new BufferedOutputStream(connection.getOutputStream()); 
     break; 
    } 
    catch(FileNotFoundException exc) 
    { 
     throw exc; 
    } 
    bis=new FileInputStream(zipfile); 

    int i;  
    byte bytes[]=new byte[4096]; 
    while((i=bis.read(bytes))!=-1) 
    { 
     sout.write(bytes,0,i); 
     sout.flush(); 
    } 
    sout.close(); 
    bis.close(); 

Le client télécharge les fichiers zip avec succès la plupart du temps. Parfois, le programme client renvoie l'exception suivante.

java.io.IOException: Error writing request body to server 
at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.checkError(Unknown Source) 
at sun.net.www.protocol.http.HttpURLConnection$StreamingOutputStream.write(Unknown Source) 
at java.io.BufferedOutputStream.flushBuffer(Unknown Source) 
at java.io.BufferedOutputStream.flush(Unknown Source) 
at SendFiles.sendNowThruHttp(SendFiles.java:449) 
at SendFiles.run(SendFiles.java:180) 

Quel pourrait être le problème?

Répondre

1

Probablement un délai d'attente réseau. Mais pour être sûr, jetez un oeil sur les fichiers journaux du serveur. Ils contiendront également un message d'erreur.

Je suggère également de jeter un oeil à la HttpClient Java library qui rend les choses comme celles-ci beaucoup plus simple tout fiable. Voir this article (vers la fin) pour un exemple.

+0

+1 pour Apache HttpClient. Il intègre une logique de gestion des erreurs qui va simplement réessayer la requête pour la plupart des erreurs de base, et vous permet également de spécifier votre propre logique. –

+0

J'ai défini la propriété disableUploadTimeout = "true" du côté Tomcat. Donc je ne pense pas que cela va expirer. – Jay

+0

@Jay: La connexion TCP expirera après deux minutes s'il n'y a pas de réponse du client/serveur. Cette valeur ne peut pas être modifiée, elle se trouve dans la pile TCP/IP de votre ordinateur. –