我正在让我的 HTTP 服务器正常关闭。我从帖子中获取了提示here https://stackoverflow.com/questions/39320025/how-to-stop-http-listenandserve,并且到目前为止已经像这样设置了我的代码:
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()
the http.Server
,或者如果它抛出错误并自行关闭。是否ListenAndServe()
即使我使用了也会抛出错误Server.ShutDown()
方法?这就是链接中接受的答案使用的原因err != http.ErrServerClosed
当检查ListenAndServe()
error?
3) The start()
函数(当然)在主线程上运行。我是否不需要以某种方式阻止该线程,以便程序不会返回并退出,或者ListenAndServe()
帮我照顾一下吗?
4)我打电话后Server.ShutDown()
我需要做什么来关闭http.HandleFunc()
听众?
如果您对这些主题提供任何帮助,我们将不胜感激,因此,如果您无法一次接触所有内容,请不要担心:)
编辑:如果有人想看看我最终如何让这一切正常工作,你可以看看这个文件 https://github.com/hewiefreeman/GopherGameServer/blob/master/server.go、第 225 行及后续。