- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我写了一个简单的网络服务器来监听端口 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/
我是一名优秀的程序员,十分优秀!