当前位置: 首页 > 面试题库 >

Golang正常关闭HTTP服务器并进行错误处理

江鹏飞
2023-03-14
问题内容

我正在使我的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()函数(当然)在主html" target="_blank">线程上运行。我是否不需要以某种方式阻止该线程,这样程序就不会返回或退出,或者会ListenAndServe()为我照顾吗?

4)打电话后Server.ShutDown(),我需要做些什么来关闭http.HandleFunc()听众?

对于这些主题中的任何帮助,将不胜感激,所以如果您无法一次接触所有内容,请不要担心:)

编辑:如果有人想看看我最终是如何使所有这些正常工作的,则可以查看此文件,第225行及以上。


问题答案:

main 函数应该以某种方式等待您要完全完成的所有go例程。

因此,1)问题:您应该阻塞主例程以确保serverError可以执行。

3)问题:绝对您应该自己在start()外面阻止start(),否则程序将立即退出。

至于2)。该文档指出:

ListenAndServe始终返回非nil错误。

所以err != http.ErrServerClosed只是为了情况而工作Server.ShutDown()。但是可能还会发生其他错误。

4)没有任何事情可以关闭,http.HandleFunc()因为Server.ShutDown()它将等待正在处理的请求。



 类似资料:
  • 问题内容: 这是我正在使用的简单网络服务器 除了保持活力外,效果很好。当第一个请求进入时,被调用。但是过程并没有结束。实际上,TCP连接仍处于打开状态,这允许另一个请求通过,这是我试图避免的。 如何关闭现有的保持活动连接? 问题答案: 您可以调用响应回调。这将关闭请求连接。 由于没有什么可做的,它也将结束您的过程,最终结果与在那里进行调用相同。

  • 删除php扩展URL。//.htAccess代码 RewriteEngine on RewiteRule^dashboard$dashboard.php[L] 内部服务器错误服务器遇到内部错误或配置错误,无法完成您的请求。 请与postmaster@localhost的服务器管理员联系,通知他们此错误发生的时间,以及您在此错误发生之前执行的操作。 有关此错误的详细信息可以在服务器错误日志中获得。

  • 问题内容: 我正在尝试用golang写一个Web服务器来处理地理编码请求。其中一些请求需要花费一分钟以上的时间来处理。在这种情况下,尽管处理程序一直在运行,但是服务器似乎正在向客户端返回一个空的主体。我尝试了下面的代码无济于事。我想念什么吗?pat这可能是个问题吗? 客户是红宝石。但我不认为这是问题所在,因为如果使用curl,我会看到类似的行为。 问题答案: 找到了问题。我没有提到我的服务器在Am

  • 接收以下共享的错误。有人能给我解答吗 提前感谢! [2021-06-14 07:21:00,047]错误{org.apache.synapse.mediators.builtin.logmediator}-ERROR_MESSAGE=执行调用操作时出错,ERROR_CODE=0,ERROR_DETAIL=org.apache.synapse.mediators.builtin.callmediat

  • 我在用IntelliJ同步Gradle。Gradle项目由IntelliJ模板提供,但错误仍然存在。 我试着: 使用Android Studio做同样的事情,同样的事情发生了 我的系统:MacOS Big Sur 所以这是错误: 这是我的gradle构建脚本: 非常感谢!!!!!!!!

  • 我试图了解gRPC中的异常处理机制是如何工作的。 除了try-catch块之外,还有其他方法来处理运行时异常,例如服务器端的IllegalArgumentException吗? 例如,我有一些gRPC流式客户端服务,当传递的参数不满足深层次的一些断言时(在某些库中,例如,com.google.common.base.Preconditions),方法onNext抛出IllegalArgumentE