2011-01-07 93 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中的真实客户端/服务器解决方案。您的服务器在套接字上侦听,并向其发送未缓冲的数据。然后你可以使你的措施客户端和服务器端并比较它们。