gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 03:21:35 25 4
gpt4 key购买 nike

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

我的代码如下:

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/52944687/

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