ListenAndServe and Server.Serve



之间有什么区别

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。发球(ln(也有效,但我不知道如果我采用第一种方式,我是否错过了什么。

考虑到在启动服务器后向服务器发送请求的目标,应用程序必须分别执行侦听和服务。

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

tcpKeepAliveListener短路。如果您需要该功能,请将代码复制到您的应用程序中。

以下是要使用的代码:

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

最新更新