package main import ( "flag" "fmt" "github.com/klipitkas/fs-go/util" "log" "net" "net/http" "os/exec" "strconv" "strings" ) var port int var dir string func main() { // Handle the flags that are provided. flag.IntVar(&port, "port", 8080, "The port that the server will listen to.") flag.StringVar(&dir, "dir", ".", "The root directory that will be served.") // Parse the flags. flag.Parse() // Create the fileserver. fs := http.FileServer(http.Dir(dir)) log.Printf("server is start %v: %v", port, dir) //check port for i := 0; i < 5; i++ { res := checkAvailablePort(port) if res == true { break } else { log.Println(strconv.Itoa(port) + " is not available.") //log.Printf("server error on port %v: %v", port, err) port = port + 1 } } // Start the file server. err := http.ListenAndServe(":"+fmt.Sprintf("%d", port), fs) if err != nil { log.Fatal("server error on port %v: %v", port, err) } // open browser l, err := net.Listen("tcp", "localhost:"+strconv.Itoa(port)) if err != nil { log.Fatal(err) } err = util.OpenUrl("http://localhost:" + strconv.Itoa(port)) if err != nil { log.Fatal(err) } log.Fatal(http.Serve(l, fs)) } //checkAvailablePort 端口可用检测,netstat 只适合linux func checkAvailablePort(port int) (res bool) { checkStatement := fmt.Sprintf(`netstat -anp | grep -q %d ; echo $?`, port) output, err := exec.Command("sh", "-c", checkStatement).CombinedOutput() if err != nil { return false } // log.println(output, string(output)) ==> [48 10] 0 或 [49 10] 1 result, err := strconv.Atoi(strings.TrimSuffix(string(output), "\n")) if err != nil { return false } if result == 0 { return false } return true }