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语言的学习指南和实际应用实例。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279