搭建离线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() 
上一篇下一篇

猜你喜欢

热点阅读