3 回答

TA貢獻1921條經驗 獲得超9個贊
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)) }()

TA貢獻1906條經驗 獲得超10個贊
該程序將在 1st 等待ListenAndServe(),直到發生任何錯誤。因為該ListenAndServe()方法永遠運行。因此,在執行到下一個之前,您的第二個服務器永遠不會啟動ListenAndServe()。go所以在第一臺服務器的聲明前使用:
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訪問你的。

TA貢獻1877條經驗 獲得超1個贊
ListenAndServe()
創建服務器失敗時將返回錯誤。只需將其處理為已知的服務器啟動成功與否。我可以看到您的編碼只會在測試服務器掛起時啟動登錄服務器。咱們試試吧
go func() { log.Fatal(loginServer.ListenAndServe()) } log.Fatal(testServer.ListenAndServe())
- 3 回答
- 0 關注
- 162 瀏覽
添加回答
舉報