2011-01-07 64 views
0

我在寫一個測試上傳速度連接到服務器的java類。我想檢查5秒內可以發送多少數據。java url連接,等待通過輸出流發送的數據

我寫過一個類,它創建一個URL,創建一個連接,並通過outPutStream發送數據。有一個循環將數據寫入數據流5秒鐘。但是,我無法看到數據何時發送(我將數據寫入輸出流,但數據尚未發送)。我如何等待,直到數據真的發送到服務器? 這裏去我的代碼(不工作):

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(); 

感謝

+0

你怎麼能斷言它不被髮送? ...已經發送並已收到回覆之間的區別 – dagnelies 2011-01-07 10:48:51

+0

好吧,對不起,我認爲我需要的是服務器已收到響應。 如果我現在寫它是如何寫的,那麼應用程序會向寫入器寫入大量數據,並且這個過程將比預期的時間多得多。 – Mateu 2011-01-07 11:05:39

回答

1

默認情況下,整個輸出流被髮送之前被緩存在內存中。您需要啓用分塊流式傳輸模式或固定長度流式傳輸模式,以便直接寫入輸出流而無需緩衝。

這裏,加

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

就是這樣!謝謝! – Mateu 2011-01-07 15:33:11

1

如果要衡量你有你不應該做它通過HTTP,因爲你不會在考慮採取協議的開銷真正的網絡速度。您需要的是原始TCP/IP中的真實客戶端/服務器解決方案。您的服務器在套接字上偵聽,並向其發送未緩衝的數據。然後你可以使你的措施客戶端和服務器端並比較它們。