我假设我可以像许多其他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应用程序所以我确实需要它来调用我的浏览器。
答案 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
}