在开放端口上打开URL

时间:2015-11-29 16:07:56

标签: go

我假设我可以像许多其他service on port 3000一样运行code samples I've seen on 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但我仍然有点困惑如何在这种情况下使用它们。

这是一个&#34;客户&#34; Web应用程序所以我确实需要它来调用我的浏览器。

1 个答案:

答案 0 :(得分:4)

不是调用ListenAndServe,而是在应用程序中创建Listener,然后调用Serve。创建侦听器时,通过将侦听器地址指定为“:0”来请求空闲端口:

angular.module('myApp', ['ngRoute'])
.config(['$routeProvider', '$httpProvider',
  function ($routeProvider, $httpProvider) {
      $httpProvider.interceptors.push(function () {
          return {
              'response': function(response)
              {
                  if (response.status === 401)
                      location.reload();
                  return response;
              }
          }
      });

  }])

监听器打开后,您可以启动浏览器:

ln, err := net.Listen("tcp", ":0")
if err != nil {
     // handle error
}

然后启动服务器:

open.Start("http://" + ln.Addr().String())

没有必要使用goroutine。

上面的代码使用addr.String()来格式化侦听器的地址。如果由于某种原因确实需要获取端口号,请使用类型断言:

if err := http.Serve(ln, nil); err != nil {
   // handle error
}