英文:
Open URL on open port
问题
我假设我可以在端口3000上运行一个服务,就像我在GitHub上看到的许多其他代码示例一样。
现在我正在尝试改进我的代码,以便在端口3000被占用时寻找一个可用的端口:
for port := 3000; port <= 3005; port++ {
fmt.Println(port)
err := http.ListenAndServe(":"+strconv.Itoa(port), nil)
if err == nil {
fmt.Println("lk is serving", dirPath, "from http://0.0.0.0:"+string(port))
open.Start("http://0.0.0.0:" + string(port))
}
}
然而,它在http.ListenAndServe这一行上阻塞,并且没有open.Start打开我的浏览器。有人告诉我应该使用goroutines,但在这种情况下我还是有点困惑如何使用它们。
这是一个“客户端”Web应用程序,所以我确实需要它来调用我的浏览器。
英文:
I'm assuming I can run a service on port 3000 like many other code samples I've seen on Github.
Now I am trying to improve my code so that it looks for an open port in case 3000 is in use:
for port := 3000; port <= 3005; port++ {
fmt.Println(port)
err := http.ListenAndServe(":"+strconv.Itoa(port), nil)
if err == nil {
fmt.Println("lk is serving", dirPath, "from http://0.0.0.0:", string(port))
open.Start("http://0.0.0.0:" + string(port))
}
}
However it blocks on the http.ListenAndServe line and doesn't open.Start my browser. I'm told I should use goroutines but I am still a bit bewildered how to use them in this context.
This is a "client" Web app so I do need it to invoke my browser.
答案1
得分: 4
不要使用ListenAndServe,而是在应用程序中创建Listener,然后调用Serve。在创建Listener时,通过将监听地址指定为":0"来请求一个空闲端口:
ln, err := net.Listen("tcp", ":0")
if err != nil {
// 处理错误
}
一旦Listener打开,你可以启动浏览器:
open.Start("http://" + ln.Addr().String())
然后启动服务器:
if err := http.Serve(ln, nil); err != nil {
// 处理错误
}
不需要使用goroutine。
上述代码使用addr.String()来格式化Listener的地址。如果出于某种原因确实需要获取端口号,可以使用类型断言:
if a, ok := ln.Addr().(*net.TCPAddr); ok {
fmt.Println("port", a.Port)
}
英文:
Instead of calling ListenAndServe, create the Listener in the application and then call Serve. When creating the listener, request a free port by specifying the listener address as ":0":
ln, err := net.Listen("tcp", ":0")
if err != nil {
// handle error
}
Once the listener is open, you can start the browser:
open.Start("http://" + ln.Addr().String())
and then start the server:
if err := http.Serve(ln, nil); err != nil {
// handle error
}
There's no need to use a goroutine.
The code above uses addr.String() to format the listener's address. If you do need to get the port number for some reason, use a type assertion:
if a, ok := ln.Addr().(*net.TCPAddr); ok {
fmt.Println("port", a.Port)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论