百思不得其解,为什么video还在播放的时候defer m.l.ReleaseConn()就已经执行了?
来源:4-7 验证streamHandler
sd1700092
2018-06-25
老师我的代码和你是一样的,
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来测试的话应该就不会出现这个问题。
032018-06-26
相似问题