Go语言实现Web服务器
Web服务器的工作方式
我们平时浏览网页的时候,会打开浏览器,然后输入网址后就可以显示出想要浏览的内容。这个看似简单的过程背后却隐藏了非常复杂的操作。对于普通的上网过程,系统其实是这样做的:
浏览器本身是一个客户端,当在浏览器中输入 URL (网址)的时候,首先浏览器会去请求 DNS 服务器,通过 DNS 获取相应的域名对应的 IP,然后通过 IP 地址找到对应的服务器后,要求建立 TCP 连接;
与服务器建立连接后,浏览器会向服务器发送 HTTP Request (请求)包;
服务器接收到请求包之后开始处理请求包,并调用自身服务,返回 HTTP Response(响应)包;
客户端收到来自服务器的响应后开始渲染这个 Response 包里的主体(body),等收到全部的内容后断开与该服务器之间的 TCP 连接。

图:用户访问一个站点的过程
通过上图可以将 Web 服务器的工作原理简单地归纳为:
客户机通过 TCP/IP 协议与服务器建立 TCP 连接;
客户端向服务器发送 HTTP 协议请求包,请求服务器里的资源文档;
服务器向客户机发送 HTTP 协议应答包,如果请求的资源包含有动态语言的内容,那么服务器会调用动态语言的解释引擎负责处理“动态内容”,并将处理得到的数据返回给客户端;
客户机与服务器断开,由客户端解释 HTML 文档,在客户端屏幕上渲染图形结果。
搭建一个简单的 Web 服务器
前面简单介绍了 Web 服务器的工作原理,那么如何用Go语言搭建一个 Web 服务器呢?示例代码如下:使用package main
import (
"fmt"
"log"
"net/http"
)
func main() {
http.HandleFunc("/", index) // index 为向 url发送请求时,调用的函数
log.Fatal(http.ListenAndServe("localhost:8000", nil))
}
func index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "C语言中文网")
}
go run 令运行上面的代码:go run main.go
运行之后并没有什么提示信息,但是令行窗口会被占用(不能再输入其它令)。这时我们在浏览器中输入 localhost:8000 可以看到下图所示的内容,则说明我们的服务器成功运行了。
图:localhost:8000
提示:运行 Web 服务器会占用令行窗口,我们可以使用 Ctrl+C 组键来退出。
上面的代码只是展示了 Web 服务器的简单应用,下面我们来完善一下,为这个服务器添加一个页面并设置访问的路由。首先我们准备一个 html 文件,并名为 index.html,代码如下所示:
然后将我们上面写的 Web 服务器的代码简单修改一下,如下所示:<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>C语言中文网</title>
</head>
<body>
<h1>C语言中文网</h1>
</body>
</html>
使用package main
import (
"io/ioutil"
"log"
"net/http"
)
func main() {
// 在/后面加上 index ,来指定访问路径
http.HandleFunc("/index", index)
log.Fatal(http.ListenAndServe("localhost:8000", nil))
}
func index(w http.ResponseWriter, r *http.Request) {
content, _ := ioutil.ReadFile("./index.html")
w.Write(content)
}
go run 令运行:go run main.go
运行成功后,在浏览器中输入 localhost:8000/index 就可以看到我们所添加的页面了,如下图所示:
图:浏览 localhost:8000/index 页面
- 随机文章
- 塞班 马尔代夫 关岛(三个热门旅游地 塞班 马尔代夫 关岛,你最喜欢哪一个?)
- 印度-马尔代夫(印度与马尔代夫寻求加强关系,商讨合作计划)
- 斐济 帕劳 马尔代夫(三大海岛国家陆续开放旅游,重振经济)
- 南昌马尔代夫自驾(南昌到马尔代夫自驾游攻略,细节详解)
- 国足马尔代夫宣传(国足携手马尔代夫打造足球文化新地标)
- 购买 马尔代夫 海岛(探索天堂之岛:迎接马尔代夫海岛的奇妙之旅)
- 无锡马尔代夫沙滩(无锡沙滩仿马尔代夫式度假地闪耀登场)
- 曼德芙岛马尔代夫(曼德芙岛:享受马尔代夫的豪华和宁静)
- 杨洋 马尔代夫(杨洋与马尔代夫浪漫之旅)
- 望江马尔代夫图片(望江撒哈拉马尔代夫照片沙漠中的绿洲)
- 泥鳗 马尔代夫(后的:马尔代夫的泥鳗文化)
- 柳城电站马尔代夫(柳城电站承建的马尔代夫电站正式投产)
- 小马尔代夫明斯克(小马尔代夫出现明斯克症状,引发担忧)
- 直飞马尔代夫仪式(直达马尔代夫:您的奢华之旅开始啦!)
- 成都小型马尔代夫(成都最具马尔代夫风情的小型度假胜地)
- 美元 马尔代夫(马尔代夫旅游业重启推升美元汇率)
- 辉县马尔代夫照片(中国辉县摄影师展示绝美马尔代夫风光)
- 辉县马尔代夫救人(辉县勇士援马尔代夫,成功救援落水者)
- 迁安方言马尔代夫(马尔代夫话里的迁安方言,您听过吗?)
- 马尔代夫中国债权(中国向马尔代夫借款成争议,舆论关注)
- 兔子 马尔代夫(马尔代夫的可爱兔子:探索动物世界的乐趣)
- 过年 马尔代夫(重温马尔代夫海岛过年游,轻松享受热带风情)
- 蜜月马尔代夫酒店(浪漫蜜月:探索马尔代夫豪华度假酒店)
- 资阳马尔代夫攻略(资阳如何畅游马尔代夫,完美攻略分享)
- 莆田马尔代夫现状(揭秘莆田医院在马尔代夫的操作现状!)
- 预定马尔代夫蜜月(浪漫马尔代夫:新婚夫妇的完美度假地)
- 珠光粉马尔代夫绿(令人心驰神往!探索马尔代夫神秘绿洲)
- 马尔代夫农业企业(马尔代夫推进农业发展,培育本土企业)
- 廊坊 马尔代夫(廊坊市民花式骑行赴马尔代夫,成为旅游新热点)
- 非洲马尔代夫介绍(探秘非洲版马尔代夫:美丽的马约特岛)
