2017-04-15 95 views
8

adresinde bir sonraki kullanılabilir bağlantı noktası nasıl kullanılır? Bağlantı noktası 8080'i dinlemek için basit bir web sunucusu yazdım. Ancak sabit kodlu bir bağlantı noktası numarası kullanmak istemiyorum. İstediğim, sunucumun kullanılabilir herhangi bir bağlantı noktasında dinlemesi. Ve web sunucumun hangi port numarasını dinlediğini bilmek istiyorum.http.ListenAndServe

Kodum feryat verilir:

package main 

import (
    "net/http" 
) 

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

} 

cevap

20

Sen tam bir bağlantı noktası belirterek değiliz ama sistem tarafından seçilen bir serbest, mevcut liman istiyorum belirtmek için bağlantı noktasını 0 kullanabilirsiniz:

http.ListenAndServe(":0", nil) 

Buradaki sorun, hangi bağlantı noktasının atandığını öğrenemeyeceğinizdir. Gördüğünüz gibi

Using port: 42039 

, atanmış bağlantı noktasını erişebilirsiniz:

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

Örnek çıktı: Yani http.Serve() iletecek elle net.Listener Kendinizi (net.Listen() işlevini kullanarak) oluşturun ve gerek net.Listener'dan, net.Addr adresinden (Addr() yöntemiyle satın alınır). net.Addr doğrudan bağlantı noktasına erişimi vermez, ama biz net.Listenertcp ağ akışı kullanılarak oluşturulan bu yana, net.Addr bir yapı olup bir alan Port int sahiptir (biz type assertion ile elde edebilirsiniz) dinamik tip *net.TCPAddr ait olacaktır.

Uygulamanızda bağlantı noktasına ihtiyacınız yoksa (örn. Yalnızca kendiniz görüntülemek istiyorsanız), tür onayına ihtiyacınız yoktur, yalnızca listener.Addr() numaralı belgeyi yazdırabilirsiniz. sonu):

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

Örnek çıkışı:

Address: [::]:42039 

Bu durumda da (http.ListenAndServe()) iade hataları işlemek için unutma. Örneğimde her şey yolunda giderse http.LitenAndServe() ve http.Serve() bloklarını bloke ettiğim için panic()'a aktardım (böylece panic()'a geçen bir hata varsa geri dönerler).

+1

Çok iyi açıklandı, teşekkürler benim için çalıştı. –