百思不得其解,为什么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回答

艾文西

2018-06-25

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

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

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

0
3
sd1700092
非常感谢!
2018-06-26
共3条回复

Go语言实战流媒体视频网站,高效学习Go高性能开发

从零开始,全面掌握Go语言编码的架构风格和开发Web的关键技能

996 学习 · 268 问题

查看课程