作者:老鼠爱上毛ee | 来源:互联网 | 2023-02-06 15:53
我写了一个简单的Web服务器来监听端口8080.但我不想使用硬编码的端口号.我想要的是我的服务器监听任何可用的端口.我想知道我的Web服务器正在侦听的端口号.
我的代码如下:
package main
import (
"net/http"
)
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}
icza..
48
您可以使用端口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
不直接提供对端口的访问,但是由于我们创建了net.Listener
使用tcp
网络流,因此net.Addr
它将是动态类型*net.TCPAddr
(我们可以通过类型断言获取),这是一个结构并且有一个字段Port int
.
请注意,如果您不需要应用程序中的端口(例如,您只想自己显示它),则不需要类型断言,只需打印listener.Addr()
(最后将包含端口):
fmt.Println("Address:", listener.Addr())
示例输出:
Address: [::]:42039
另外不要忘记处理返回的错误(http.ListenAndServe()
在这种情况下).在我的例子中,我简单地将它传递给panic()
因为http.LitenAndServe()
并http.Serve()
阻止一切顺利(所以如果出现错误,我们只会返回panic()
).
1> icza..:
您可以使用端口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
不直接提供对端口的访问,但是由于我们创建了net.Listener
使用tcp
网络流,因此net.Addr
它将是动态类型*net.TCPAddr
(我们可以通过类型断言获取),这是一个结构并且有一个字段Port int
.
请注意,如果您不需要应用程序中的端口(例如,您只想自己显示它),则不需要类型断言,只需打印listener.Addr()
(最后将包含端口):
fmt.Println("Address:", listener.Addr())
示例输出:
Address: [::]:42039
另外不要忘记处理返回的错误(http.ListenAndServe()
在这种情况下).在我的例子中,我简单地将它传递给panic()
因为http.LitenAndServe()
并http.Serve()
阻止一切顺利(所以如果出现错误,我们只会返回panic()
).