我正在构建一个Web服务器应用程序,根据请求使用HTTP 1.1协议和分块传输编码将不同大小的文件从服务器发送到客户端。
我使用Java Sockets
/ ServerSockets
来处理连接。我使用从socket.getOutputStream()
获得的输出流将数据发送到客户端。注意:我不将套接字的输出流包装在BufferedOutputStream
中。
(我使用chrome调试器来分析资源时间)
我看到的问题是,一个大小为1285字节的文件(加上标题和块编码)需要花费超过50毫秒才能让chrome接收请求的第一个字节。 (Chrome报告的TTFB为~50ms),然后快速传输剩余(1-2ms)(总传输时间~52ms)
但是如果我将文件的大小增加到1286字节,TTFB会急剧下降到~1ms。 (总传输时间~3ms)
我尝试在flush
强制OutputStream
处于不同的点,包括在请求标头之后,在块之后,甚至在每个点尝试多个flush
调用乐趣。
我的问题:为什么小文件的传输时间比任何大于或等于1286字节的文件长得多?我该怎么做才能解决这个性能问题?
我的理论:底层套接字实现中的某些内容忽略了对flush
底层套接字缓冲区的Java请求,尽管Java调用{{1} }。
答案 0 :(得分:2)