Go: Comment puis-je démarrer le navigateur après que le serveur a commencé à écouter?

Dans Go, comment puis-je démarrer le navigateur APRÈS que le serveur a commencé à écouter?
De préférence le plus simple possible.

Mon code jusqu’ici, super bête au point:

package main import ( // Standard library packages "fmt" "net/http" "github.com/skratchdot/open-golang/open" // Third party packages "github.com/julienschmidt/httprouter" ) // go get github.com/toqueteos/webbrowser func 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") } 

S’il n’y a pas d’erreur, http.ListenAndServe() ne reviendra jamais. Donc, vous ne devriez pas append de code après cela, à l’exception du code qui gère l’échec.

Vous devez démarrer un nouveau goroutine, donc ListenAndServe() est appelé dans une goroutine et le code vérifiant s’il est actif doit être exécuté sur l’autre goroutine.

Et vous pouvez vérifier si votre serveur est opérationnel en lui faisant un simple appel HTTP GET , par exemple en utilisant http.Get() .

L’exemple suivant retarde expressément le démarrage pendant 7 secondes. Le nouveau goroutine lance une boucle sans fin qui vérifie si le serveur est actif, en dormant 1 seconde entre les tentatives.

Exemple:

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

Exemple de sortie:

 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! 

Ouvrez l’écouteur, lancez le navigateur, puis entrez la boucle du serveur:

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

Il n’y a pas besoin de sondage comme indiqué dans une autre réponse. Le navigateur se connectera si la prise d’écoute est ouverte avant le démarrage du navigateur.

ListenAndServe est une fonction pratique qui ouvre un socket et appelle Serve. Le code dans cette réponse divise ces étapes afin que le navigateur puisse être ouvert après le début de l’écoute, mais avant l’appel bloquant au service.