请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

百思不得其解,为什么video还在播放的时候defer m.l.ReleaseConn()就已经执行了?

老师我的代码和你是一样的,

func (m middleWareHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
	if !m.l.GetConn() {
		sendErrorResponse(w, http.StatusTooManyRequests, "Too many requests.")
		return
	}
	m.r.ServeHTTP(w, r)
	defer m.l.ReleaseConn()
}
func streamHandler(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
	vid:=p.ByName("vid-id")
	vl:=VIDEO_DIR+vid
	video, err:=os.Open(vl)
	if err!=nil{
		sendErrorResponse(w, http.StatusInternalServerError, "error of open video: " + err.Error())
		return
	}
	w.Header().Set("Content-Type", "video/mp4")
	http.ServeContent(w, r, "", time.Now(), video)
	
	defer video.Close()
}

不知道为什么我的视频刚开始播放时控制台就开始打印,如下所示:

2018/06/25 22:44:07 Successfully got connection

2018/06/25 22:44:08 New connection coming: 1

2018/06/25 22:44:08 Successfully got connection

2018/06/25 22:44:08 New connection coming: 1

2018/06/25 22:44:08 Successfully got connection

2018/06/25 22:44:08 New connection coming: 1

2018/06/25 22:44:08 Successfully got connection

2018/06/25 22:44:16 New connection coming: 1

于是我的limiter control当然失败了,设了buffer容量缓冲为2没有用,现在我感觉我的代码和老师一样但就是可以开N个窗口同时播放。。。。

老师可以的话能pull一下我的代码检查一下吗。。。

https://github.com/sd1700092/video_server.git

应该不会花您很长时间的,谢谢了。。。

正在回答

1回答

这个跟H5在浏览器的处理方式有关系,如果默认缓存开启的话,浏览器会自动去缓存中找已经缓冲好的视频。因此直接会结束你的新request,但是确实是在播放。

这个流控方案实际上是个比较简单的流控,为了保证不会超过最大链接N,从而给服务端造成压力,因此如果client端通过缓存等方式已经提前结束stream的request,那么自然就会出现你说的这种情况。

比如你用upload来测试的话应该就不会出现这个问题。

0 回复 有任何疑惑可以回复我~
  • 提问者 sd1700092 #1
    那我们的服务端有什么方法限制客户端使用缓存,以避免提前结束request吗?
    回复 有任何疑惑可以回复我~ 2018-06-26 06:39:41
  • 艾文西 回复 提问者 sd1700092 #2
    这是客户端的行为。我们流控的作用是控制并发链接数,如果客户端不从我们server取视频或者下来的最后一章我会在云上改造直接将streaming的部分redirect到云存储,那么这个链接就会变成非常短的链接,这些情况下,流控就不会显得特别明显。这个是没有关系的,如果同时访问的用户大于连接数限制一样会报429的。
    回复 有任何疑惑可以回复我~ 2018-06-26 11:16:25
  • 提问者 sd1700092 #3
    非常感谢!
    回复 有任何疑惑可以回复我~ 2018-06-26 11:23:52
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信