main.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package main
  2. import (
  3. "flag"
  4. "fmt"
  5. "github.com/klipitkas/fs-go/util"
  6. "log"
  7. "net"
  8. "net/http"
  9. "os/exec"
  10. "strconv"
  11. "strings"
  12. )
  13. var port int
  14. var dir string
  15. func main() {
  16. // Handle the flags that are provided.
  17. flag.IntVar(&port, "port", 8080, "The port that the server will listen to.")
  18. flag.StringVar(&dir, "dir", ".", "The root directory that will be served.")
  19. // Parse the flags.
  20. flag.Parse()
  21. // Create the fileserver.
  22. fs := http.FileServer(http.Dir(dir))
  23. log.Printf("server is start %v: %v", port, dir)
  24. //check port
  25. for i := 0; i < 5; i++ {
  26. res := checkAvailablePort(port)
  27. if res == true {
  28. break
  29. } else {
  30. log.Println(strconv.Itoa(port) + " is not available.")
  31. //log.Printf("server error on port %v: %v", port, err)
  32. port = port + 1
  33. }
  34. }
  35. // Start the file server.
  36. err := http.ListenAndServe(":"+fmt.Sprintf("%d", port), fs)
  37. if err != nil {
  38. log.Fatal("server error on port %v: %v", port, err)
  39. }
  40. // open browser
  41. l, err := net.Listen("tcp", "localhost:"+strconv.Itoa(port))
  42. if err != nil {
  43. log.Fatal(err)
  44. }
  45. err = util.OpenUrl("http://localhost:" + strconv.Itoa(port))
  46. if err != nil {
  47. log.Fatal(err)
  48. }
  49. log.Fatal(http.Serve(l, fs))
  50. }
  51. //checkAvailablePort 端口可用检测,netstat 只适合linux
  52. func checkAvailablePort(port int) (res bool) {
  53. checkStatement := fmt.Sprintf(`netstat -anp | grep -q %d ; echo $?`, port)
  54. output, err := exec.Command("sh", "-c", checkStatement).CombinedOutput()
  55. if err != nil {
  56. return false
  57. }
  58. // log.println(output, string(output)) ==> [48 10] 0 或 [49 10] 1
  59. result, err := strconv.Atoi(strings.TrimSuffix(string(output), "\n"))
  60. if err != nil {
  61. return false
  62. }
  63. if result == 0 {
  64. return false
  65. }
  66. return true
  67. }