ListenAndServe и Server.Serve - PullRequest
       16

ListenAndServe и Server.Serve

0 голосов
/ 15 ноября 2018

В чем разница между

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 голосов
/ 15 ноября 2018

Учитывая цель отправки запросов на сервер после запуска сервера, приложение должно выполнить прослушивание и обслуживать отдельно.

Подход отправки запросов после запуска ListenAndServe в обычной программе не гарантирует, что сервер прослушивает, когда запросы отправляются. Основная программа может продолжить выполнение перед отправкой, пока она вообще не будет выполнена.

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
...