2017-04-15 15 views
8

Napisałem prosty serwer WWW do nasłuchu na porcie 8080. Ale nie chcę używać twardego numeru portu. To, czego chcę, to to, że mój serwer nasłuchuje na każdym dostępnym porcie. I chcę wiedzieć, na jakim numerze portu mój serwer sieciowy nasłuchuje.Jak używać następnego dostępnego portu w http.ListenAndServe

Mój kod jest podany poniżej:

package main 

import (
    "net/http" 
) 

func main() {  
    http.HandleFunc("/", handler) 
    http.ListenAndServe(":8080", nil) 

} 

Odpowiedz

20

Można użyć portu 0 wskazać nie jesteś podając dokładną portu ale chcesz darmowy, dostępny port wybrany przez system:

http.ListenAndServe(":0", nil) 

Problem polega na tym, że nie będzie można ustalić, który port został przypisany. Więc trzeba stworzyć net.Listener samodzielnie (przy użyciu funkcji net.Listen()) i ręcznie przekazać go do http.Serve():

listener, err := net.Listen("tcp", ":0") 
if err != nil { 
    panic(err) 
} 

fmt.Println("Using port:", listener.Addr().(*net.TCPAddr).Port) 

panic(http.Serve(listener, nil)) 

Przykâadowa:

Using port: 42039 

Jak widać, można uzyskać dostęp do przypisanego portu od net.Listener, z adresu net.Addr (uzyskanego za pomocą metody Addr()). net.Addr bezpośrednio nie dać dostęp do portu, ale ponieważ stworzyliśmy net.Listener użyciu tcp strumień w sieci, to net.Addr będzie dynamicznego typu *net.TCPAddr (który możemy nabyć z type assertion), który jest struct i ma pole Port int.

Pamiętaj, że jeśli nie potrzebujesz portu w aplikacji (np. Chcesz go sam wyświetlić), nie potrzebujesz potwierdzenia typu, możesz po prostu wydrukować listener.Addr() (który będzie zawierał port koniec):

fmt.Println("Address:", listener.Addr()) 

Przykâadowa:

Address: [::]:42039 

również nie zapomnij do obsługi zwracanych błędów (http.ListenAndServe() w tym przypadku). W moim przykładzie po prostu przekazałem go do panic(), ponieważ blokuje wszystko, jeśli wszystko idzie dobrze (więc zwracają się tylko wtedy, gdy wystąpił błąd, który przekazuję do panic()).

+1

Bardzo dobrze wyjaśniono, Dzięki, że pracował dla mnie. –

Powiązane problemy