亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

服務器開始偵聽后如何啟動瀏覽器?

服務器開始偵聽后如何啟動瀏覽器?

Go
慕婉清6462132 2021-11-08 18:10:22
在 Go 中,如何在服務器開始偵聽后啟動瀏覽器?最好是最簡單的方法。到目前為止,我的代碼非常簡單:package mainimport (      // Standard library packages    "fmt"    "net/http"    "github.com/skratchdot/open-golang/open"    // Third party packages    "github.com/julienschmidt/httprouter")// go get github.com/toqueteos/webbrowserfunc main() {      // Instantiate a new router    r := httprouter.New()    // Add a handler on /test    r.GET("/test", func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {        // Simply write some test data for now        fmt.Fprint(w, "Welcome!\n")    })        //open.Run("https://google.com/")         // open.Start("https://google.com")    // http://127.0.0.1:3000/test    // Fire up the server    http.ListenAndServe("localhost:3000", r)    fmt.Println("ListenAndServe is blocking")      open.RunWith("http://localhost:3000/test", "firefox")      fmt.Println("Done")}
查看完整描述

3 回答

?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

打開監聽器,啟動瀏覽器,然后進入服務端循環:


l, err := net.Listen("tcp", "localhost:3000")

if err != nil {

    log.Fatal(err)

}


// The browser can connect now because the listening socket is open.


err := open.Start("http://localhost:3000/test")

if err != nil {

     log.Println(err)

}


// Start the blocking server loop.


log.Fatal(http.Serve(l, r)) 

沒有必要進行投票,如另一個答案所示。如果在瀏覽器啟動之前打開監聽套接字,瀏覽器將連接。


ListenAndServe 是一個方便的函數,它打開一個套接字并調用 Serve。此答案中的代碼拆分了這些步驟,因此可以在偵聽開始后但在阻止調用 Serve 之前打開瀏覽器。


查看完整回答
反對 回復 2021-11-08
?
函數式編程

TA貢獻1807條經驗 獲得超9個贊

如果沒有錯誤,http.ListenAndServe()永遠不會返回。因此,除了處理失敗的代碼之外,您不應該在此之后添加代碼。


你必須啟動一個新的 goroutine,所以ListenAndServe()在一個 goroutine 中調用,檢查它是否啟動的代碼應該在另一個 goroutine 上運行。


您可以通過對其進行簡單的 HTTPGET調用來檢查您的服務器是否已啟動,例如使用http.Get().


以下示例故意將啟動延遲 7 秒。新的 goroutine 開始一個無限for循環,檢查服務器是否啟動,兩次嘗試之間休眠 1 秒。


例子:


http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {

    w.Write([]byte("Hi!"))

})


go func() {

    for {

        time.Sleep(time.Second)


        log.Println("Checking if started...")

        resp, err := http.Get("http://localhost:8081")

        if err != nil {

            log.Println("Failed:", err)

            continue

        }

        resp.Body.Close()

        if resp.StatusCode != http.StatusOK {

            log.Println("Not OK:", resp.StatusCode)

            continue

        }


        // Reached this point: server is up and running!

        break

    }

    log.Println("SERVER UP AND RUNNING!")

}()


log.Println("Starting server...")

time.Sleep(time.Second * 7)

log.Fatal(http.ListenAndServe(":8081", nil))

示例輸出:


2015/09/23 13:53:03 Starting server...

2015/09/23 13:53:04 Checking if started...

2015/09/23 13:53:06 Failed: Get http://localhost:8081: dial tcp [::1]:8081: connectex: No connection could be made because the target machine actively refused it.

2015/09/23 13:53:07 Checking if started...

2015/09/23 13:53:09 Failed: Get http://localhost:8081: dial tcp [::1]:8081: connectex: No connection could be made because the target machine actively refused it.

2015/09/23 13:53:10 Checking if started...

2015/09/23 13:53:10 SERVER UP AND RUNNING!


查看完整回答
反對 回復 2021-11-08
?
肥皂起泡泡

TA貢獻1829條經驗 獲得超6個贊

API 并不是絕對糟糕,但我們只是說“需要一些時間來適應”。以下是在 Server 結構上使用自定義屬性的方法:


s := &http.Server{

    Addr:           cnf.API_SERVER_ADDRESS,

    Handler:        h,

    ReadTimeout:    0, // 1 * time.Minute,

    WriteTimeout:   30 * time.Minute,

    MaxHeaderBytes: 1 << 20,

}


go func() {


    l, err := net.Listen("tcp", cnf.API_SERVER_ADDRESS)


    if err != nil {

        log.Fatal(err)

    }


    fmt.Println(`{"server_state":"listening"}`)

    log.Fatal(s.Serve(l));

}()

因為如果你改為使用:


http.Serve(l, handler)

那么你就不能在服務器上定義自定義屬性


查看完整回答
反對 回復 2021-11-08
  • 3 回答
  • 0 關注
  • 230 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號