我正在测试一个支持
HTTP byte range requests的
HTTP servlet implementation (kindly shared by BalusC).
我发现不同的HTTP客户端之间有一些特殊的区别,并且想知道我是否没有丢失任何东西.我使用了> 2G mp4视频文件进行测试,并且正在使用Wireshark捕获数据包.大致如此:
>三星Galaxy SII:
> HTTP GET请求文件来,要求字节范围[0; ]
>服务器响应,开始流文件
>每个后续组块在同一HTTP响应的范围内提供.没有发送新的HTTP请求(除非视频被快速转发到某个位置).流代码块很简单,它读取RandomAccessFile输入并通过byte []缓冲区写入OutputStream输出:
while ((read = input.read(buffer)) > 0) {
output.write(buffer,read);
}
> iPad 1
> HTTP GET请求文件来,开始流文件
> iPad获得一两块,然后单方面决定停止接收来自服务器的字节,并为文件的下一个块发出单独的GET请求.新的范围边界是例如[100,几乎结束文件].视频显示为OK.
>循环从步骤2再次重复.左边界总是向文件的末尾移动.
我没有调查连接是如何终止的.可能是iPad停止发送TCP ACK数据包,我想这并不重要.
我的问题是,对于每个终止的连接我得到java.net.SocketException:破坏管道异常.这不仅会污染日志(这是一个小问题/可解决的问题),但是我相信这会导致性能下降,因为引发异常是非常昂贵的.当观看简单的视频时,例外率约为1个异常/秒,但是如果服务器有100个并发用户,则JVM可能会花费大量的时间只是计算堆栈跟踪,而不是做实际工作.
我也使用iOS 6在iPhone上测试了这一点,并且能够观察到与iPad 1相同的行为.只是重申,这不会发生在三星Android或任何桌面浏览器我已经尝试,包括桌面Mac上的Safari.
问题:
这是iPad / iPhone的知识bug /功能吗?
有没有解决办法?