2017-04-15 17 views
8

Tôi đã viết một máy chủ web đơn giản để nghe trên cổng 8080. Nhưng tôi không muốn sử dụng số cổng được mã hóa cứng. Những gì tôi muốn là máy chủ của tôi lắng nghe trên bất kỳ cổng có sẵn nào. Và tôi muốn biết rằng số cổng của máy chủ web của tôi đang nghe.Cách sử dụng cổng sẵn có tiếp theo trong http.ListenAndServe

Mã của tôi được đưa ra dưới đây:

package main 

import (
    "net/http" 
) 

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

} 

Trả lời

20

Bạn có thể sử dụng cổng 0 để chỉ ra bạn không chỉ định một cổng chính xác nhưng bạn muốn có một miễn phí, cổng có sẵn bởi hệ thống chọn:

http.ListenAndServe(":0", nil) 

Vấn đề với điều này là bạn sẽ không thể tìm ra cổng nào được gán. Vì vậy, bạn cần phải tạo ra các net.Listener mình (sử dụng net.Listen() chức năng), và tự vượt qua nó để 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)) 

Ví dụ đầu ra:

Using port: 42039 

Như bạn thấy, bạn có thể truy cập vào cổng được gán từ số net.Listener, từ địa chỉ net.Addr (được mua theo phương thức Addr()). net.Addr không trực tiếp cấp quyền truy cập vào cổng, nhưng vì chúng tôi đã tạo net.Listener sử dụng luồng mạng tcp, net.Addr sẽ thuộc loại động *net.TCPAddr (chúng tôi có thể có được type assertion), cấu trúc và có trường Port int. Lưu ý rằng nếu bạn không cần cổng trong ứng dụng của bạn (ví dụ như bạn chỉ muốn hiển thị nó cho chính mình), bạn không cần xác nhận kiểu, bạn có thể chỉ cần in listener.Addr() (sẽ chứa cổng tại địa chỉ này). Quay lại đầu trang cuối):

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

Ví dụ đầu ra:

Address: [::]:42039 

Cũng đừng quên để xử lý các lỗi trả lại (http.ListenAndServe() trong trường hợp này). Trong ví dụ của tôi, tôi chỉ cần chuyển nó đến panic()http.LitenAndServe()http.Serve() chặn nếu mọi thứ suôn sẻ (vì vậy, chúng chỉ trả về nếu có lỗi, tôi chuyển đến panic()).

+1

Rất tốt giải thích, Cảm ơn đã làm việc cho tôi. –

Các vấn đề liên quan