我正在让我的 HTTP 服务器正常关闭。我已经从这里的帖子中获取了提示,并且到目前为止已经设置了这样的代码:
func start() {
//......
//START HTTP/SOCKET LISTENER
if settings.TLS {
httpServer = makeServer("/wss", settings.TLS);
} else {
httpServer = makeServer("/ws", settings.TLS);
}
//...
}
func makeServer(handleDir string, tls bool) (*http.Server) {
server := &http.Server{Addr: settings.IP+":"+strconv.Itoa(settings.Port)}
http.HandleFunc(handleDir, socketInitializer)
if tls {
go func() {
err := server.ListenAndServeTLS(settings.CertFile, settings.PrivKeyFile)
if err != nil {
serverError(err)
}
}()
}else{
go func() {
err := server.ListenAndServe()
if err != nil {
serverError(err)
}
}()
}
//
return server
}
所以,我对这一切现在如何运作有一些疑问:
1)我在上面链接的答案指出“注意:下一行有可能没有时间运行......”用于ListenAndServe()
goroutine 内的错误处理。我怎样才能确保这serverError()
将保证完成?我是否需要对该线程进行某种阻塞,或者我是否需要在它可以调用的主线程上创建一个通道?
2)截至目前,我不确定我是否有办法判断我是否有Server.ShutDown()
,http.Server
或者它是否抛出错误并自行关闭。ListenAndServe()
即使我使用该Server.ShutDown()
方法也会引发错误吗?err != http.ErrServerClosed
这就是为什么在检查ListenAndServe()
错误时使用链接中接受的答案的原因吗?
3)start()
函数(当然)在主线程上运行。我不需要以某种方式阻止该线程,这样程序就不会返回和退出,或者是否ListenAndServe()
会为我处理这个问题?
4)打电话后Server.ShutDown()
我需要做任何事情来关闭http.HandleFunc()
听众吗?
非常感谢您对这些主题中的任何一个提供任何帮助,因此,如果您不能一次触及所有内容,请不要担心:)
编辑:如果有人想看看我最终是如何让这一切正常工作的,你可以查看这个文件,第 225 行等。