2012-04-14 6 views
1

Vor einigen Tagen ich in ein ernstes Problem ausführen, die mir Kopfschmerzen gibt:Java: Download Stände immer

Alle Java-basierte Tools (Eclipse Maven, Android SDK loader ...) haben Probleme beim Download von bestimmten Dateien: die Download stoppt nur zufällig.

Ich habe bereits mein Problem bei Superuser beschrieben, aber niemand konnte mir mit meinem Problem helfen. Daher begann ich selbst einige Tests durchzuführen und endete mit dem Beispielcode am Ende dieser Frage.

Der interessante Teil ist, dass die Puffergröße einen kleinen Einfluss auf das Problem hat. Wenn ich die Puffergröße auf 1024 reduziere, wird der Download in den meisten Fällen abgeschlossen.

Macht dieser Code nur Probleme auf meinem Windows-System?

Um es klar zu stellen: Ich möchte kein Download-Programm mit Java entwickeln - daher hilft mir die Korrektur des Beispielcodes nicht - der Code dient nur zur Demonstration des Problems.

public static void main(String[] args) { 
    try { 
     URL url = new URL("http://mirror.netcologne.de/maven2/com/google/android/android/2.3.3/android-2.3.3.jar"); 

     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     InputStream in = conn.getInputStream(); 
     byte[] buffer = new byte[10485760]; // 10MiB 
     long read = 0; 
     while (true) { 
      int bytes = in.read(buffer, 0, buffer.length); 
      if (bytes < 0) 
       break; 
      read += bytes; 
      System.out.println("Bytes read: " + read); 
     } 
     conn.disconnect(); 
     System.out.println("Finished"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
+0

Wie hört es auf? Wird eine Ausnahme ausgelöst? Hängt es? Ist es Timeout? Liest es so viele Bytes aber nicht die ganze Datei? –

+0

@Marlin: Der Datenfluss geht gerade auf Null, keine Exception und kein Timeout. Manchmal stoppt es nach dem Laden von ~ 1,4 MiB manchmal bei 3,2 MiB (oder anderen Werten). – Robert

+0

Wie lange haben Sie gewartet, bis der Datenfluss gestoppt wurde? Wie hoch ist die Umlaufwartezeit, wenn der Datenfluss stoppt? Sie können die Wartezeit mit Ping bestimmen. –

Antwort

1

Das Problem, das Sie ist gegenüber von Java 7 verursacht - im Detail, dass IPv6 eine höhere Priorität als IPv4 gibt.

Dieses Problem betrifft alle basierte Software Java, sondern tritt nur auf einigen Computern (kann von der verwendeten Internet-Verbindung und/oder lokalen Netzwerkkomponenten wie Switches, Router hängen ...)

Sie es zurück zu IPv4 ändern wie es in Java 6 verwendet wurde, indem die Systemeigenschaft gesetzt wurde java.net.preferIPv4Stack=true

Die Einstellung dieser Eigenschaft ist für jede Anwendung unterschiedlich. Für Eclipse müssen Sie es in der eclipse.ini einstellen.

Für Andovird SDK-Manager müssen Sie die Datei tools\android.bat bearbeiten und den Java-Aufruf am Ende der Datei den Parameter -Djava.net.preferIPv4Stack=true hinzufügen.