iPad/iPhone上的HTTP字节范围协议客户端行为

min*_*das 12 java iphone streaming http ipad

我正在测试支持HTTP字节范围请求HTTP servlet实现(由BalusC共享).

我发现不同的HTTP客户端之间存在一些特殊的差异,并且想知道我是否遗漏了任何东西.我使用了> 2G mp4视频文件进行测试,并使用Wireshark捕获数据包.这大致是发生的事情:

  • 三星Galaxy SII:

    • 文件的HTTP GET请求到来,要求字节范围 [0; <almost the end of the file>]
    • 服务器响应,开始流式传输文件
    • 每个后续块在同一HTTP响应的范围内提供.没有发送新的HTTP请求(除非视频被快速转发到某个位置).该流码块是相当简单,它读取RandomAccessFile input和写入OutputStream output通过byte[] buffer:

      while ((read = input.read(buffer)) > 0) {
          output.write(buffer, 0, read);
      }
      
      Run Code Online (Sandbox Code Playgroud)
  • iPad 1
    • 文件的HTTP GET请求到来,要求字节范围 [0; <almost the end of the file>]
    • 服务器响应,开始流式传输文件
    • iPad获得一两块,然后单方面决定停止接受来自服务器的字节,并为文件的下一个块发出单独的GET请求.例如,新的范围边界[100, almost the end of the file].视频显示正常.
    • 从第2步开始重复循环.左边界始终向文件末尾移动.

我没有调查连接的确切方式.可能是iPad停止发送TCP ACK数据包,我想这并不重要.

我的问题是,对于每个终止的连接,我都会遇到java.net.SocketException: Broken pipe异常.这不仅会污染日志(这是一个小问题/可解决的问题),但我相信这会影响性能,因为提高异常是非常昂贵的.在观看简单视频时,异常率约为1个异常/秒,但如果服务器有100个并发用户,则JVM可能会花费大量时间来计算堆栈跟踪而不是实际工作.

我也使用iOS 6在iPhone上进行了测试,并且能够观察到与iPad 1相同的行为.重申一下,这不会发生在三星Android或我尝试过的任何桌面浏览器上,包括桌面Mac上的Safari.

问题:

  • 这是iPad/iPhone的知识错误/功能吗?
  • 这是一个解决方法吗?

Asc*_*ude 1

在 iPhone 上进行流式传输时,您需要发送 Accept Ranges 标头。这可能会导致您的问题。看这个帖子

在 iOS 上,MP4 直接访问时可以播放,但通过 PHP 读取时不能播放