2011-01-07 3 views
0

Ich schreibe eine Java-Klasse, die Upload-Geschwindigkeit-Verbindung zu einem Server testet. Ich möchte prüfen, wie viele Daten in 5 Sekunden gesendet werden können.Java-URL-Verbindung, warten auf Daten durch den Ausgangsstrom gesendet werden

Ich habe eine Klasse geschrieben, die eine URL erstellt, eine Verbindung erstellt und Daten über den outPutStream sendet. Es gibt eine Schleife, wo ich für 5 Sekunden Daten in den Stream geschrieben habe. Allerdings kann ich nicht sehen, wann Daten gesendet wurden (Ich habe Daten in den Ausgabestream geschrieben, aber die Daten werden noch nicht gesendet). Wie kann ich warten bis Daten wirklich an den Server gesendet werden? geht hier meinen Code (was nicht funktioniert):

URL u = new URL(url) 
HttpURLConnection uc = (HttpURLConnection) u.openConnection(); 
uc.setDoOutput(true); 
uc.setDoInput(true); 
uc.setUseCaches(false); 
uc.setDefaultUseCaches(false); 
uc.setRequestMethod("POST"); 
uc.setRequestProperty("Content-Type", "application/octet-stream"); 
uc.connect(); 
st.start(); 

// Send the request 
OutputStream os = uc.getOutputStream(); 
//This while is incorrect cause it does not wait for data beeing sent 
while (st.getElapsedTime() < miliSeconds) { 
    os.write(buffer); 
    os.flush(); 
    st.addSize(buffer.length); 

} 
os.close(); 

Dank

+0

Wie können Sie feststellen, dass es nicht gesendet wird? ... es gibt einen Unterschied zwischen dem Senden und dem Erhalt der Antwort – dagnelies

+0

Ok, tut mir leid, ich denke, dass der Server die Antwort erhalten hat. Wenn ich es so mache, wie es jetzt geschrieben ist, schreibt die Anwendung viele Daten an den Schreiber, und der Prozess wird viel mehr als die gewünschte Zeit dauern. – Mateu

Antwort

1

standardmäßig der gesamte Ausgangsstrom gesendet im Speicher gepuffert wird, bevor sie. Sie müssen den Chunked-Streaming-Modus oder den Streaming-Modus mit fester Länge aktivieren, damit der Ausgabestream direkt ohne Pufferung geschrieben wird.

Hier fügen

HttpURLConnection uc = (HttpURLConnection) u.openConnection(); 
uc.setChunkedStreamingMode(8192); // <-- enable chunked streaming mode before connecting to server. 
+0

Das ist es! Vielen Dank! – Mateu

1

Wenn Sie die reale Geschwindigkeit des Netzwerks Sie Sie es über HTTP nicht tun sollte messen wollen, weil Sie in Konto den Aufwand des Protokolls nicht stattfinden wird. Was Sie brauchen, ist eine echte Client/Server-Lösung in Raw TCP/IP. Ihr Server hört einen Socket ab und Sie senden ungepufferte Daten an ihn. Dann können Sie Ihre Maßnahmen Client-Server-Seite und vergleichen Sie sie.

+0

Wahr, aber ich brauche nur eine Art von Annäherung. Vielen Dank. – Mateu

Verwandte Themen