gpt4 book ai didi

http - ListenAndServe 和 Server.Serve

转载 作者:数据小太阳 更新时间:2023-10-29 03:10:12 25 4
gpt4 key购买 nike

有什么区别

ln, err := net.Listen("tcp", addr)
if err != nil {
return err
}
go srv.Serve(ln)

ln, err := net.Listen("tcp", addr)
if err != nil {
return err
}
return srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)})

?

我正在创建我自己的 ListenAndServe(第一个代码片段),以便我可以在调用我的 ListenAndServe 后立即执行代码并向我的服务器发送请求。但是,我无法使用 tcpKeepAliveListener,因为它未导出。 srv.Serve(ln) 也可以,但我不知道如果我采用第一种方式,我是否遗漏了什么。

最佳答案

鉴于在启动服务器后向服务器发送请求的目标,应用程序必须单独执行 listen 和 serve。

在 goroutine 中启动 ListenAndServe 后发送请求的方法不能保证在发送请求时服务器正在监听。主 goroutine 有可能在 goroutine 完全执行之前继续执行发送。

tcpKeepAliveListener 很短。如果您需要该功能,请复制 the code到您的应用程序。

这是要使用的代码:

ln, err := net.Listen("tcp", addr)
if err != nil {
log.Fatal(err)

}

go func() {
log.Fatal(srv.Serve(tcpKeepAliveListener{ln.(*net.TCPListener)}))

}()

// The Serve loop is not guaranteed to be running at this point, but
// the listening socket is open and requests to the socket will queue.

... send requests here

关于http - ListenAndServe 和 Server.Serve,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53323674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com