在打开的端口上打开URL

huangapple go评论88阅读模式
英文:

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 &lt;= 3005; port++ {
    fmt.Println(port)
    err := http.ListenAndServe(&quot;:&quot;+strconv.Itoa(port), nil)
    if err == nil {
        fmt.Println(&quot;lk is serving&quot;, dirPath, &quot;from http://0.0.0.0:&quot;, string(port))
        open.Start(&quot;http://0.0.0.0:&quot; + 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(&quot;tcp&quot;, &quot;:0&quot;)
if err != nil {
     // handle error
}

Once the listener is open, you can start the browser:

open.Start(&quot;http://&quot; + 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(&quot;port&quot;, a.Port)
}

huangapple
  • 本文由 发表于 2015年11月30日 00:07:55
  • 转载请务必保留本文链接:https://go.coder-hub.com/33984850.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定