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语言的学习指南和实际应用实例。
有疑问加站长微信联系(非本文作者)