|
@@ -5,8 +5,11 @@ import (
|
|
|
"fmt"
|
|
|
"github.com/klipitkas/fs-go/util"
|
|
|
"log"
|
|
|
+ "net"
|
|
|
"net/http"
|
|
|
+ "os/exec"
|
|
|
"strconv"
|
|
|
+ "strings"
|
|
|
)
|
|
|
|
|
|
var port int
|
|
@@ -23,16 +26,50 @@ func main() {
|
|
|
// Create the fileserver.
|
|
|
fs := http.FileServer(http.Dir(dir))
|
|
|
log.Printf("server is start %v: %v", port, dir)
|
|
|
- // Start the file server.
|
|
|
+ //check port
|
|
|
for i := 0; i < 5; i++ {
|
|
|
- err := http.ListenAndServe(":"+fmt.Sprintf("%d", port), fs)
|
|
|
- if err != nil {
|
|
|
- log.Printf("server error on port %v: %v", port, err)
|
|
|
- port = port + 1
|
|
|
- } else {
|
|
|
- log.Printf("File Server - Port: %v | Dir: %v", port, dir)
|
|
|
+ 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
|
|
|
}
|
|
|
}
|
|
|
- _ = util.OpenUrl("http://localhost:" + strconv.Itoa(port))
|
|
|
+
|
|
|
+ // 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
|
|
|
}
|