Gox语言10行代码实现静态文件Web服务器并同时支持HTTP/HTTPS(SSL)协议-GX37.2

Gox语言实现一个静态页面和资源文件为主的WEB服务器也是相当的容易,下面我们就来实现一个支持静态页面和资源文件(如图片、音频、视频等)的WEB服务器框架,并且还同时支持HTTPS(SSL加密连接)功能。

// 设置所需使用到的Go语言标准包中的http包与path/filepath的简称
http = net_http
filepath = path_filepath

// 设置http协议的服务端口为8080
portG = ":8080"

// 设置https/ssl协议的端口为8443
sslPortG = ":8443"

// 设置根路径
basePathG = `c:\web`

// muxG是用于存储Web服务器路由的全局变量
muxG = nil

// staticFS是存储静态页面处理器的全局变量
staticFS = nil

// serveStaticDirHandler函数用于处理静态页面请求
func serveStaticDirHandler(w, r) {
    // 如果staticFS没有初始化则初始化之
    // 这样页面文件的基本路径就是c:\web\pages
    if staticFS == nil {
        staticFS = http.FileServer(http.Dir(filepath.Join(basePathG, "pages")))
    }

    // 拼装一下本地路径到URL路径
    old := r.URL.Path
    name := filepath.Join(basePathG, "pages", path.Clean(old))

    // 获取本地文件的文件信息
    info, err := os.Lstat(name)

    if err == nil { // 如果文件存在
        if !info.IsDir() { // 如果不是目录,则直接在网页上显示该文件(或者提供下载)
            staticFS.ServeHTTP(w, r)
        } else { // 如果是目录
            // 如果该目录下存在index.html则显示它
            if tk.IfFileExists(filepath.Join(name, "index.html")) {
                staticFS.ServeHTTP(w, r)
            } else { // 否则网页返回404错误,表示网页未找到
                http.NotFound(w, r)
            }
        }
    } else { // 如果文件访问出错,则网页返回404错误,表示网页未找到
        http.NotFound(w, r)
    }

}

// 启动https/ssl服务
// 注意在c:\web目录下需要有与域名相匹配的的server.crt证书文件和server.key私钥文件
func startHttpsServer(portA) {
    pl("trying to start https server on %v...", portA)

    err := http.ListenAndServeTLS(portA, filepath.Join(basePathG, "server.crt"), filepath.Join(basePathG, "server.key"), muxG)
    if err != nil {
        pl("failed to start https server: %v", err)
    }

}

// 初始化Web路由器对象muxG
muxG = http.NewServeMux()

// 设置处理URL根路由的函数为静态页面处理函数
muxG.HandleFunc("/", serveStaticDirHandler)

// 在sslPortG指定的端口(本例中为8443)上启动https服务
go startHttpsServer(sslPortG)

pl("trying to start http server on %v...", portG)

// 在portG指定的端口(本例中为8080)上启动http服务
err := http.ListenAndServe(portG, muxG)

if err != nil {
    pl("failed to start http server: %v", err)
}


然后确保创建了c:\web\pages文件夹,并且在其中存放了index.html或其他文件后,执行代码,再打开浏览器访问https://127.0.0.1:8080/index.html,可以得到类似下面的运行效果:

可以看到,一个支持静态页面的WEB服务器已经搭建成功了。如果申请成功了SSL证书,并将证书和私钥文件正确按说明放在指定文件夹下,则可以按证书指定的域名访问8443端口使用https服务。

整个程序中有效代码不超过十几行而已,那么还可以简化吗?我们这回来个极限操作,看看接近最简版的代码吧!

staticFS = net_http.FileServer(net_http.Dir(path_filepath.Join(`c:\web`, "pages")))

func serveStaticDirHandler(w, r) {
    name = path_filepath.Join(`c:\web`, "pages", path.Clean(r.URL.Path))

    info, err = os.Lstat(name)
    if err == nil && (!info.IsDir() || tk.IfFileExists(path_filepath.Join(name, "index.html"))) {
        staticFS.ServeHTTP(w, r)
    } else {
        net_http.NotFound(w, r)
    }
}

muxG = net_http.NewServeMux()

muxG.HandleFunc("/", serveStaticDirHandler)

go plerr(net_http.ListenAndServeTLS(":8443", path_filepath.Join(`c:\web`, "server.crt"), path_filepath.Join(`c:\web`, "server.key"), muxG))

checkErrf("failed to start http server: %v", net_http.ListenAndServe(":8080", muxG))


与之前的代码几乎功能完全相同,而有效代码精简至大约10行。

注意:

  • Gox语言是脱胎于Go语言(Golang)的开源脚本语言,解释执行,但相比Go语言更贴近高级语言,语法硬性限制也少一些;是一门偏向快速应用的语言,也可以说是一个集成工具;

  • Gox语言主要优势有三点:

    • 第一,Gox语言本身只有一个可执行文件,绿色免配置,下载即可使用,无需安装Go语言环境,无需编译,非常适合快速制作原型以及云服务器上的远程开发;
    • 第二,Gox中可以直接使用绝大多数Go语言标准库中的对象和方法函数,也内置了很多常用、优秀的第三方库,充分发挥Go语言多年积累的资源优势;
    • 第三,与很多其他主流语言不同,Gox语言着力解决了GUI图形界面编程的问题,内置了基于Giu(imgui)、LCL、Sciter的三套图形界面编程库,直接可以进行快捷高效的图形界面开发(LCL、Sciter只需分别下载一个动态链接库文件,执行和分发时附带上即可),特别适合编写演示原型系统。

作为脚本语言,Gox语言性能肯定不如Go语言这样的编译型语言快,但由于Gox语言与Go语言的紧密联系,Gox语言编写的脚本可以很容易的改写成Go语言代码,编译执行后就可以发挥Go语言的速度优势了。因此,Gox语言也比较适合做初期的Go语言调试,还有一个更直接的方式是使用Gotx(在Gox官网上也有下载),这是使用完全和Go语言一样语法的解释器,可以理解成集成了Go语言标准库和不少第三方库的解释执行的Go语言,一样也不需要搭建Go语言环境。Gotx与Gox的区别在于,Gotx仍然遵循Go语言的文法,代码相对复杂一些,限制也多一些,但改写回Go语言准备编译执行时,基本上没有成本。

Gox的官网在这里,也可以在浏览器搜索引擎中直接搜索“gox语言”,Github页面在这里,在这里可以看到很多Gox语言的学习指南和实际应用实例。