搭建离线m3u8代理服务器时,遇到播放器不播放问题

问题描述

想要实现可以播放本地的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() 
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,079评论 19 139
  • iPhone的标准推荐是CFNetwork 库编程,其封装好的开源库是 cocoa AsyncSocket库,用它...
    Ethan_Struggle阅读 2,290评论 2 12
  • https://nodejs.org/api/documentation.html 工具模块 Assert 测试 ...
    KeKeMars阅读 6,440评论 0 6
  • __block和__weak修饰符的区别其实是挺明显的:1.__block不管是ARC还是MRC模式下都可以使用,...
    LZM轮回阅读 3,399评论 0 6
  • 一场秋雨过后,又到了金桂飘香的时节,楼下院子里的桂花树上,点缀的黄色的花朵,一阵清风拂过,花香四溢,想着这么美好的...
    夏日夜阅读 184评论 0 0