ListenAndServe和Server.Serve

时间:2018-11-15 16:18:12

标签: http go listen 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.Serve(ln)也可以,但我不知道如果我采用第一种方法,是否会丢失某些东西。

1 个答案:

答案 0 :(得分:1)

鉴于启动服务器后将请求发送到服务器的目标,应用程序必须执行侦听并单独服务。

在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