gpt4 book ai didi

http - 如何在 http.ListenAndServe 中使用下一个可用端口

转载 作者:IT老高 更新时间:2023-10-28 13:04:04 41 4
gpt4 key购买 nike

我编写了一个简单的 Web 服务器来监听端口 8080。但我不想使用硬编码的端口号。我想要的是我的服务器监听任何可用的端口。我想知道我的网络服务器正在监听的端口号。

我的代码如下:

package main

import (
"net/http"
)

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

}

最佳答案

您可以使用端口 0 来表示您没有指定确切的端口,但您想要系统选择的免费、可用端口:

http.ListenAndServe(":0", nil)

这样做的问题是您将无法找出分配的端口。所以你需要创建 net.Listener自己(使用 net.Listen() 函数),并手动将其传递给 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))

示例输出:

Using port: 42039

如您所见,您可以从 net.Listener 访问分配的端口,从其 net.Addr地址(通过其 Addr() 方法获取)。 net.Addr 并不直接提供对端口的访问权限,但是由于我们使用 tcp 网络流创建了 net.Listener,因此 net.Addr 将是动态类型 *net.TCPAddr (我们可以通过 type assertion 获得),它是一个结构体,有一个字段 Port int

请注意,如果您的应用程序中不需要该端口(例如,您只想自己显示它),则不需要类型断言,您只需打印 listener.Addr()(将在末尾包含端口):

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

示例输出:

Address: [::]:42039

也不要忘记处理返回的错误(在本例中为 http.ListenAndServe())。在我的示例中,我只是将它传递给 panic() 因为如果一切顺利, http.LitenAndServe()http.Serve() 会阻塞(所以它们只有在出现错误时才返回,我将其传递给 panic())。

关于http - 如何在 http.ListenAndServe 中使用下一个可用端口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43424787/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com