搭建离线m3u8代理服务器时,遇到播放器不播放问题
2017-03-03 本文已影响464人
小木桨
问题描述
想要实现可以播放本地的m3u8文件,第一次播放时先从网上下载,第二次播放的时候则读取本地缓存的文件,使用ServerSocket搭建了一个代理服务器,将代理地址设置给播放器,播放器可以正常发送m3u8请求,代理服务器也能接收到请求并且读取本地的m3u8返回给播放器,但是在服务器输出完文件后并且flush输出流后,播放器并没有开始播放,也不请求m3u8中ts文件,一直是缓冲状态。。。
解决方案
最终的原因是在ServerSocket接收到客户端请求的Socket后没有给客户端Socket设置read超时时间,并且也没有主动去关闭socket,所以就导致了客户端以为没有服务器没有输出完数据,一直在等待中。。。
设置read超时方法: setSoTimeout
setSoTimeout
public void setSoTimeout(int timeout)
throws SocketException启用/禁用带有指定超时值的 SO_TIMEOUT,以毫秒为单位。将此选项设为非零的超时值时,在与此 Socket 关联的 InputStream 上调用 read() 将只阻塞此时间长度。
如果超过超时值,将引发 java.net.SocketTimeoutException,虽然 Socket 仍旧有效。选项必须在进入阻塞操作前被启用才能生效。
超时值必须是 > 0 的数。超时值为 0 被解释为无穷大超时值。
参数:
timeout - 指定的以毫秒为单位的超时值。
抛出:
SocketException - 如果底层协议出现错误,例如 TCP 错误。
从以下版本开始:
JDK 1.1
另请参见:
getSoTimeout()