go启动web服务提供下文件使用
小记
启动一个web服务目录供下载文件等测试使用
package main
import (
"flag"
"fmt"
"net"
"net/http"
"os"
"os/signal"
"syscall"
)
func main() {
// 解析命令行参数
port := parseCommandLineArgs()
// 使用 http.FileServer 创建文件服务器,并将根路径 "/" 映射到当前目录
http.Handle("/", http.FileServer(http.Dir(".")))
// 启动Web服务器并监听指定的端口和本机IP地址
ip := getLocalIP()
addr := fmt.Sprintf("%s:%d", ip, port)
fmt.Printf("服务器正在运行,访问地址:http://%sn", addr)
// 创建一个用于优雅关闭的通道
done := make(chan os.Signal, 1)
signal.Notify(done, syscall.SIGINT, syscall.SIGTERM)
go func() {
if err := http.ListenAndServe(addr, nil); err != nil {
fmt.Println(err)
}
}()
// 等待接收中断信号
<-done
fmt.Println("服务器已停止")
}
// 获取本机的IP地址
func getLocalIP() string {
addrs, err := net.InterfaceAddrs()
if err != nil {
fmt.Println("无法获取本机IP地址:", err)
os.Exit(1)
}
for _, addr := range addrs {
if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() && ipnet.IP.To4() != nil {
return ipnet.IP.String()
}
}
fmt.Println("未找到本机IP地址")
os.Exit(1)
return ""
}
// 解析命令行参数
func parseCommandLineArgs() int {
var port int
// 定义命令行选项
flag.Usage = func() {
fmt.Printf("使用方法: %s [端口号]nn", os.Args[0])
fmt.Println("参数:")
flag.PrintDefaults()
}
// 解析命令行选项
defaultPort := 8080
flag.IntVar(&port, "p", defaultPort, "要使用的端口号,默认为8080")
flag.Parse()
// 显示使用说明
if len(os.Args) < 2 && flag.NFlag() == 0 {
fmt.Printf("使用方法: ./webhttp -p 8888n")
fmt.Printf("未提供端口号,默认使用%dn", defaultPort)
fmt.Printf("按ctrl+c停止n")
} else if len(os.Args) < 2 {
flag.Usage()
os.Exit(0)
}
return port
}
原文始发于微信公众号(echoabced):go启动web服务提供下文件使用
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论