Как я могу узнать, когда два сервера готовы получать запросы? - PullRequest
0 голосов
/ 21 ноября 2018

У меня есть два сервера

router := createServer()
loginServer := createLoginServerMock()
servLogin := &http.Server{
    Addr:         ":9333",
    Handler:      loginServer,
}
testServer := &http.Server{
    Addr:         ":9444",
    Handler:      router,
}
loginServer.ListenAndServe()
testServer.ListenAndServe()

И я хочу отправить запрос на них обоих после их создания?Как я могу это обнаружить?

Ответы [ 3 ]

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

Программа будет ждать 1-го ListenAndServe(), пока не возникнет какая-либо ошибка.Потому что метод ListenAndServe() работает вечно.Таким образом, ваш второй сервер никогда не запустится, пока выполнение не перейдет к следующему ListenAndServe().Поэтому используйте go перед оператором 1-го сервера:

router := createServer()
loginServer := createLoginServerMock()
go func() {
    if err := http.ListenAndServe(":9333", loginServer); err != nil {
        log.Fatal("login server err: ", err)
    }
}()
if err := http.ListenAndServe(":9444", router); err != nil {
    log.Fatal("test server err: ", err)
}

Затем получите доступ к вашим loginServer в http://localhost:9333 и testServer в http://localhost:9444.

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

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

loginListener, err := net.Listen("tcp", ":9333")
if err != nil {
    // TODO: handle err
}

testListener, err := net.Listen("tcp", ":9444")
if err != nil {
    // TODO: handle err
}

// You may already start sending requests now. They will just wait until
// the servers call Accept on their respective listener (i.e. shortly after
// Serve is called).

servLogin := &http.Server{Handler: loginServer}
testServer := &http.Server{Handler: router}

go func() { log.Fatal(servLogin.Serve(loginListener)) }()
go func() { log.Fatal(testServer.Serve(testListener)) }()
0 голосов
/ 21 ноября 2018

ListenAndServe() вернет ошибку, если создать сервер не удалось.Просто справьтесь с известным успехом запуска сервера или нет.Я вижу, что ваша кодировка только запустит сервер авторизации, пока тестовый сервер будет зависать.Давайте попробуем

go func() {
  log.Fatal(loginServer.ListenAndServe())
}
log.Fatal(testServer.ListenAndServe())
...