10 líneas de código en lenguaje Gox para realizar un servidor web de archivos estáticos y admitir el protocolo HTTP / HTTPS (SSL)-GX37.2

También es bastante fácil implementar un servidor WEB basado en páginas estáticas y archivos de recursos en lenguaje Gox. Ahora implementaremos un marco de servidor WEB que admita páginas estáticas y archivos de recursos (como imágenes, audio, video, etc.) y también sea compatible con HTTPS. (Conexión cifrada 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)
}


Luego, asegúrese de crear la carpeta c: \ web \ pages y almacenar index.html u otros archivos en ella, ejecute el código y luego abra el navegador para visitar https://127.0.0.1:8080/index.html, puede obtener Similar al siguiente efecto de operación:

Como puede ver, se ha construido con éxito un servidor WEB que admite páginas estáticas. Si solicita con éxito el certificado SSL y coloca el certificado y el archivo de clave privada en la carpeta especificada de acuerdo con las instrucciones, puede acceder al puerto 8443 de acuerdo con el nombre de dominio especificado por el certificado y utilizar el servicio https.

El código efectivo en todo el programa no excede de una docena de líneas, entonces, ¿se puede simplificar? Volvamos a la operación extrema, ¡echemos un vistazo al código que se acerca a la versión más simple!

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))


La función es casi la misma que la del código anterior y el código efectivo se reduce a unas 10 líneas.

Nota:

  • El lenguaje Gox es un lenguaje de programación de código abierto nacido del lenguaje Go (Golang). Se interpreta y ejecuta, pero en comparación con el lenguaje Go, está más cerca de un lenguaje de alto nivel y tiene menos restricciones gramaticales. Es un lenguaje que se inclina hacia la aplicación rápida, y también se puede decir que es una integración herramienta;

  • Hay tres ventajas principales del lenguaje Gox:

    • Primero, el lenguaje Gox en sí tiene solo un archivo ejecutable, que es verde sin configuración y se puede usar después de la descarga. No necesita instalar el entorno de lenguaje Go y no necesita compilar. Es muy adecuado para la producción rápida de prototipos y el desarrollo remoto en servidores en la nube;
    • En segundo lugar, Gox puede usar directamente la mayoría de los objetos y las funciones de métodos en la biblioteca estándar del lenguaje Go, y también hay muchas bibliotecas de terceros de uso común y excelentes integradas para aprovechar al máximo las ventajas de recursos acumuladas por el lenguaje Go durante muchos años;
    • En tercer lugar, a diferencia de muchos otros lenguajes convencionales, el lenguaje Gox se centra en resolver el problema de la programación de la interfaz gráfica GUI. Tiene incorporados tres conjuntos de bibliotecas de programación de interfaz gráfica basadas en Giu (imgui), LCL y Sciter, lo que permite un desarrollo de la interfaz gráfica rápida y eficiente directamente. (LCL y Sciter solo necesitan descargar un archivo de biblioteca de enlace dinámico por separado y adjuntarlo al ejecutarlo y distribuirlo), especialmente adecuado para escribir un sistema prototipo de demostración.

Como lenguaje de scripting, el rendimiento del lenguaje Gox definitivamente no es tan rápido como un lenguaje compilado como el lenguaje Go, pero debido a la estrecha conexión entre el lenguaje Gox y el lenguaje Go, los scripts escritos en el lenguaje Gox se pueden reescribir fácilmente en el código del lenguaje Go, que se puede usar después de la compilación y ejecución. Go tiene la ventaja de velocidad. Por lo tanto, el lenguaje Gox también es más adecuado para la depuración inicial del lenguaje Go, y una forma más directa es usar Gotx (también disponible para descargar en el sitio web oficial de Gox), que es un intérprete que usa la misma sintaxis que el lenguaje Go, que puede entenderse como integración. El lenguaje Go, que es interpretado y ejecutado por la biblioteca estándar del lenguaje Go y muchas bibliotecas de terceros, tampoco necesita crear un entorno de lenguaje Go. La diferencia entre Gotx y Gox es que Gotx todavía sigue la gramática del lenguaje Go, el código es relativamente más complicado y hay más restricciones, pero básicamente no hay costo al reescribirlo al lenguaje Go para su compilación y ejecución.

El sitio web oficial de Gox está aquí . También puede buscar "idioma gox" directamente en el motor de búsqueda del navegador. La página de Github está aquí . Puede ver muchas guías de aprendizaje de idiomas Gox y ejemplos de aplicaciones prácticas aquí.

Supongo que te gusta

Origin blog.csdn.net/weixin_41462458/article/details/107630164
Recomendado
Clasificación