2016-04-03 13 views
0

Ich versuche, die Menge der Daten durch eine URLConnection pro Sekunde übertragen zu begrenzen. Ich implementierte einen Wrapper für InputStream s und OutputStream s, sowie für Sockets, die diese Streams verwenden. Als Nächstes habe ich eine benutzerdefinierte SocketFactory erstellt, die die begrenzten Sockets bereitstellt. Aber jetzt ist das Problem, dass ich nicht weiß, wie ich eine URLConnection einrichten kann, die meine SocketFactory verwendet. Hast du irgendwelche Ideen, wie das zu realisieren ist?Implementieren begrenzte Bandbreite für eine URLConnection

Eine Möglichkeit wäre, die URLConnetion s zu ändern, um meine gedrosselten Streams zu verwenden, aber es wäre großartig, auf den Socket zuzugreifen, der von der URLConnection selbst verwendet wird.

Antwort

0

hallo ist dies auf eine andere Frage im Zusammenhang: How can I limit bandwidth in Java?

Diese Lösung ist einfach und funktioniert gut für mich.

// SERVER CODE

Stream in; 
long timestamp = System.currentTimeInMillis(); 
int counter = 0; 
int INTERVAL = 1000; // one second 
int LIMIT = 1000; // bytes per INTERVAL 

... 

/** 
* Read one byte with rate limiting 
*/ 
@Override 
public int read() { 
    if (counter > LIMIT) { 
     long now = System.currentTimeInMillis(); 
     if (timestamp + INTERVAL >= now) { 
      Thread.sleep(timestamp + INTERVAL - now); 
     } 
     timestamp = now; 
     counter = 0; 
    } 
    int res = in.read(); 
    if (res >= 0) { 
     counter++; 
    } 
    return res; 
} 

// Client-Code

URL oracle = new URL("http://www.oracle.com/"); 
     URLConnection yc = oracle.openConnection(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(
            yc.getInputStream())); 
     String inputLine; 
     while ((inputLine = in.readLine()) != null) 
      System.out.println(inputLine); 
     in.close(); 

Quelle der Client-Code: https://docs.oracle.com/javase/tutorial/networking/urls/readingWriting.html

+0

fand ich auch, dass die Gewinde. Es hat mir geholfen, limitierte Streams und Sockets zu implementieren. Aber jetzt muss ich wissen, wie man diese Sockets in einer URLConnection benutzt. – CitizenVayne

+0

ok, möchten Sie den Client für diese URLConnection erstellen? – jeorfevre

+0

Ja, ich bin auf der Client-Seite. Ich könnte den von Ihnen bereitgestellten Code verwenden, um eine URLConnection mit begrenzten Daten pro Zeitraum zu erstellen. Trotzdem wäre es gut, wenn ich den darunterliegenden Socket direkt irgendwie adressieren könnte. Ich wollte die zugewiesene Puffergröße für das Senden und Empfangen auf dem Socket ändern. – CitizenVayne