Browse Source

增加端口检测方法

liuyuqi-dellpc 5 years ago
parent
commit
2d968fc0b7
1 changed files with 45 additions and 8 deletions
  1. 45 8
      main.go

+ 45 - 8
main.go

@@ -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
 }